Suche einfachen XML-Parser

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Suche einfachen XML-Parser

    zum verarbeiten von XML-Daten die ich empfange und auf meiner Seite formatiert anzeigen möchte.

    Da ich nicht alle Tags aus der XML-Datei verarbeiten will, sollte er eine Möglichkeit haben, die Tags anzugeben, die ich behalten möchte. Den Rest soll der Parser ignorieren.

    Auch sollte er die Möglichkeit haben Loopbare XML-Elemente als Array zurückzugeben, so dass ich diese in einer Schleife durchlaufen kann.

    Wisst Ihr ob so etwas möglich ist und wenn ja, wo man so einen Parser bekommen könnte.

  • #2
    Hi,

    hier muss erst klargestellt werden :

    1) Welche XML Docs verwendet werden, wird vom Stylesheets, wie XSL oder CSS bestimmt, oft mit Hilfe von Standards für den selektierten Zugriff, wie xpath, xpointer, xlink oder xquery. - s. www.w3.org

    2) Der Parser bildet aus XML mit dem Stylesheet eine Ansicht z.B. HTML, PDF, TeX, RTF ...
    Übliche Parser sind z.B:
    - Xalan, FOP im Java Umfeld - http://xml.apache.org
    - MSXML in MS Umfeld. (Der ist bereits in den meisten MS Systemen integriert - suche bei http://msdn.microsoft.com .
    - Sablotron und Jade als Exe-Parser. http://www.gingerall.com/charlie/ga/xml/p_sab.xml http://www.jclark.com/jade/

    3) 'loopbasiert' ist wohl eine neue Wortschöpfung von Dir. Als ich vermute mal, Du setzt VB oder Delphi ein - daher der Begriff.
    Wie Du aus XML ein Array erhälst, wird von der jeweiligen Programmier- oder Sprachen-API bestimmt, um XML zu lesen oder zu bearbeiten - s. in den jeweiligen Dokumentationen.

    oder googlen ...

    cu

    Blaster
    Zuletzt geändert von Blaster; 02.04.2003, 20:17.
    Yuppi, endlich Elite ...

    Kommentar


    • #3

      3) 'loopbasiert' ist wohl eine neue Wortschöpfung von Dir. Als ich vermute mal, Du setzt VB oder Delphi ein - daher der Begriff.
      Wie Du aus XML ein Array erhälst, wird von der jeweiligen Programmier- oder Sprachen-API bestimmt, um XML zu lesen oder zu bearbeiten - s. in den jeweiligen Dokumentationen.
      Ja das ist mein Wort
      Was ich meine sind in der DTD definierte Elemente die einen Count von 0 oder beliebig haben. So wie zb
      <Thema name="Thema1">
      <News id=1>
      <Titel>Ich bin die Überschrift</Titel>
      <Untertitel>ich bin die Unterschrift</Untertitel>
      <Nachricht>ich bin die Nachricht 1</Nachricht>
      </News>
      <News id=2>
      <Titel>Ich bin die zweite Überschrift</Titel>
      <Untertitel>ich bin die zweite Unterschrift</Untertitel>
      <Nachricht>ich bin die Nachricht 2</Nachricht>
      </News>
      </Thema>

      und so weiter und so fort

      Nun ist mein Anliegen, eine Lösung zu finden, mit der ich diese "Loopbaren" Elemente definieren kann. Am besten als Array $loop_tags oder sonstwie.
      und ich die einzelnen Elemente in einen zweiten Array $standard_tags parse.
      Nun sollen diese Elemente in einen multidimensionalen Array zusammengefasst werden, so dass ich die komplette XML-Datei als Array vorliegen habe.

      sprich
      print_r($gesamt_array);
      sollte ausgeben:

      PHP-Code:
      array ("Thema" => array ("name" => "Thema1",
                
      "News" =>
                          [
      0] => array("ID" => 1,
                                              
      "Titel" => "Ich bin die Überschrift",
                                              
      "Subtitel" => "ich bin der Untertext",
                                              
      "Nachricht" => "ich bin die Nachricht"
                                              
      ),
                          [
      1] => array("ID" => 2,
                                              
      "Titel" => "Ich bin die zweite Überschrift",
                                              
      "Subtitel" => "ich bin der Untertext",
                                              
      "Nachricht" => "ich bin die Nachricht"
                                              
      )
                )
      )
      usw..... 
      so dass ich die Ausgabe hinterher in einer einfachen for oder While schleife ausgeben kann

      oder googlen ...
      Haste bei dem Thema schon mal gegoogelt...da kannste auch gleich ins Freibad gehen, kommt beides irgendwie komisch zur Zeit. Naja ich werde mal weitersuchen.
      Zuletzt geändert von spoilie; 02.04.2003, 23:07.

      Kommentar


      • #4
        XSL

        ist zwar auch eine Lösung aber bis ich mit diesen Dingen sinnvoll auseinander gesetzt habe ist aller Tage Abend.

        Benötige ich dann zum Anzeigen nicht auch einen XSLT-Preprocessor oder sowas in der art?

        Ich denke mit PHP sollte das auch funktionieren obwohl die XSL/XSLT Variante natürlich unabhängiger und auch portabler ist.

        Kommentar


        • #5
          Tja,

          mit xsl wären es 3-5 Zeilen ...

          Um jetzt xml mit PHP in ein Array umzuwandeln, sehe zwei Möglichkeiten:
          PHP-Code:
           // mit DOMXML
          $yourXMLFile xmldocfile("themen.xml");
          $yourXMLFile->xpath_init();
          $xpth $yourXMLFile->xpath_new_context();
          $expr "/thema/news[@id <= $beliebig]";
          // xnode ist dann dein Array
          xnode xpah_eval ($xpth$expr); 
          // ------------------------------------------------------------------------

          //mit EXPAT-XML
          $par_obj xml_parser_create();
          xml_set_element_handler ($par_obj"ersterTreffer""letzterTreffer");
          $yourXMLFile fopen ("themen.xml""r");
          while (
          $data fread ($yourXMLFile4096)) {
                 
          xml_parse ($par_obj$data,  feof($yourXMLFile));
          };

          function 
          ersterTreffer($par_obj$elementname$attribute) {
          // Dein Array"          
                   
          foreach ($attribute as $key => $value) {
                          if(
          $key == "id" && $value <='beliebig') {
                                 
          // erstelle dein Array
                          
          }
                            ....
                   }
          }

          function 
          letzterTreffer ($parser$element){
              
          // mach was zum Schluss

          Das Array sieht vielleicht etwas anders aus.
          Anstelle DOMXML kannst Du auch PEAR::XML_Tree verwenden.
          Haste bei dem Thema schon mal gegoogelt...da kannste auch gleich ins Freibad gehen, kommt beides irgendwie komisch zur Zeit. Naja ich werde mal weitersuchen
          Wenn meine Kunden jemals erfahren sollten, wie teuer Sie 5 min Google bezahlt haben, werde ich standrechtlich erschossen.

          cu

          Blaster
          Yuppi, endlich Elite ...

          Kommentar


          • #6
            Habs geschafft

            Hi Blaster,

            ich habe einen Parser geschrieben, den ich aber aus verschiedenen Gründen jetzt noch nicht veröffentliche.

            Aber damit du ein Bild von dem bekommst was genau der Parser leisten sollte und es jetzt auch tut, habe ich einen Beispielaufruf, der die Klasse parse einbindet.

            PHP-Code:
            $XML_INPUT curl_post_read($url$post_params_send);

            if (
            $XML_INPUT) {
             
            /* array der die zu parsenden Elemente festlegt */
                    
            $element_array = array(
                                       
            "thema" => "thema",
                                       
            "fehlermeldung" => "fehlermeldung"
                                       
            );
             
            /* array der die attribute der Elemente festlegt die geparst werden sollen */
                    
            $attribute_array = array(
                                         
            "news" => array (
                                                             
            "id"
                                                             
            )
                                         );
             
            /* array der elemente die loopen */
                    
            $looping_array = array(
                                       
            "news" => array (
                                                           
            "titel",
                                                           
            "untertitel",
                                                           
            "nachricht"
                                                           
            )
                                       );
             
            /* , und angabe des arrays zum speichern */
                    
            $store_looping_array = array(
                                             
            "news" => "newsloop"
                                             
            );

             
            /* parser erzeugen */

                    
            $parse = new parse;
                    
            $result $parse->par************ML($XML_INPUT); 
            So wo ich das jetzt hard gecodet habe, würde mich deine Lösung des XSL doch auch interessieren, wo das doch nur 3-5 Zeilen sind.

            Kommentar


            • #7
              Re: Habs geschafft

              Original geschrieben von spoilie
              Hi Blaster,

              ich habe einen Parser geschrieben, den ich aber aus verschiedenen Gründen jetzt noch nicht veröffentliche.
              ...
              So wo ich das jetzt hard gecodet habe, würde mich deine Lösung des XSL doch auch interessieren, wo das doch nur 3-5 Zeilen sind.
              Ich habe in meinen Bekanntenkreis ´n Hacker. - Alles was er braucht, ist seine 3,5 Zoll Diskette. Mit ihr schreibt er in wenigen MINUTEN in ASSEMBLER kleinere Tools für gezielten Blödsinn.
              Ich bewunde solche Leute! Auch wenn Sie jedes Mal 'das Rad neu erfinden' ....

              Aber hast Dir " ´n Bombon verdient":
              PHP-Code:
               ...
              <
              xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                  <
              xsloutput method "html" encoding="ISO-8859-1" indent="yes"/>
              ...
              // Varinate a
              <xsl:template match="//themen/news/[@id &lt;={$beliebig}]" />
                  <
              xsl:value-of select="." />
              <
              xsl:template>
               
              // $beliebig ist xsl-param oder Konstante

              // Varinate b
              <xsl:template match="//themen/news/[@id &lt;={$beliebig}]" />
                 <
              td>Title:         <xsl:value-of select="title" /></td>
                 <
              td>Untertitle: ....
              <
              xsl:template>

              // Variante  c
              <xsl:template match="//themen/news/ " />
                <
              xsl:if test="@id &lt;= {$beliebig}">
                    <
              xsl:value-of select="." />
                </
              xsl:if>
              </
              xsl:template>

              // Variante d
              <xsl:sort select="child:themen" order="ascending" >
                 <
              xsl:value-of select="news/@id &lt;={$beliebig}/>
              </
              xsl:sort>
              ...
              usw
              und ein paar die mir im Moment nicht einfallen ...

              Mit dem Stylesheet und XML wird über XSLT HTML gebildet, ohne über Scriptspache zu gehen. Die Automation dieses Prozesses, erfolgt allerdings über eine Scriptsprache....

              Ich danke Ihnen aber für den Raport - "Schütze spoilie".

              Gut gemacht! - Wegtreten! *Salut* :

              Oberst Blaster
              Yuppi, endlich Elite ...

              Kommentar

              Lädt...
              X