Andrea: [PHP&XML] - XML Datei korrekt verarbeiten

Hi alle zusammen,

ich hab folgendes Problem, ich würde gern eine xml Datei mit folgendem
Inhalt nutzen:

<?xml version='1.0'?>
<autos>
  <Baujahr2000>
     <BMW>
        3er
        5er
        7er
     </BMW>
     <Audi>
        6er
        8er
     </Audi>
     <SpecialCars>
        Porsche Cayenne
        BMW X3
     </SpecialCars>
  </Baujahr2000>
  <Baujahr2001>
  ...usw...
  </Baujahr2001>
</autos>

Nun möchte ich mit php und dem xmlparser gern die gewünschen Baujahrgänge
und vorselektierten Hersteller, z.B. BMW auslesen, ohne die ganze xml Datei
vorher in ein Array zu schreiben, aller xml_parse_into_struct()

Is es möglich folgende Ausgabe zu erreichen:

Anfang Baujahr: Baujahr2000
Anfang Hersteller: BMW
Modelle:3er,5er,7er
Ende Hersteller
Ende Baujahr

Und wenn ja, wie denn nur???? ;o)

Bin echt schon lange am suchen und bin auch über die "xml_set_element_handler()" und "xml_set_character_data_handler()"
gestolpert, aber entweder ich bekomme alle Tags und danach alle Datablöcke oder es klappt nichts... :o(

Wäre jemand so freundlich und könnte mir einen Anstoß geben ;o)

Vielen Dank und liebe Grüße,
Andrea

  1. Ups, ich nochmal ;o)

    und es sollt unter php 4 und 5 laufen...
    und ich würd gern auf apis wie dom oder simple-xml verzichten...

    und, und, und... ;o)

    Danke und Grüße,
    Andrea

    1. Hallo,

      Ups, ich nochmal ;o)

      und es sollt unter php 4 und 5 laufen...
      und ich würd gern auf apis wie dom oder simple-xml verzichten...

      und, und, und... ;o)

      Willst du programmieren oder nicht?
      (http://forum.de.selfhtml.org/?t=167753&m=1094356)

      Bis bald,
      Sascha

      1. Morgen zusammen,

        danke für die vielen Antworten!!!

        ich glaub ich werd es mal mit <model>3er</model>
        probieren und doch die handler nehmen...

        Ich hab auch gestern abend noch ein bißchen rumgespielt und folgenden code getestet:
        <?php
        class xml
        {
        var $parser;

        function xml()
        {
         $this->parser = xml_parser_create();
         xml_set_object($this->parser, $this);
         xml_set_element_handler($this->parser, "tag_open", "tag_close");
         xml_set_character_data_handler($this->parser, "cdata");
        }

        function parse($data)
        {
         xml_parse($this->parser, $data);
        }

        function tag_open($parser, $tag, $attributes)
        {
         echo("--> tag_open start: <br>");
         var_dump($parser, $tag, $attributes);
         echo("<br>--> tag_open end: <br><br>");
        }

        function cdata($parser, $cdata)
        {
         echo("--> cdata start: <br>");
         var_dump($parser, $cdata);
         echo("<br>--> cdata end: <br><br>");
        }

        function tag_close($parser, $tag)
        {
         echo("--> tag_close start: <br>");
         var_dump($parser, $tag);
         echo("<br>--> tag_close end: <br><br>");
        }

        } // end of class xml

        $xml_parser = new xml();

        $xml_parser->parse("<A ID='a1'>Text A</A>");
        ?>

        Folgende Fragen:

        Die Klasse heißt xml, aber wo zum Teufel wird denn die funktion xml aufgerufen, bin ich blind? ;o)

        Und wie kann ich das so modifizieren, dass ich eine xml datei mit mehreren Einträgen nutzen kann???

        Über wieder so zahlreiche Einträge würd ich mich freuen...

        Liebe Grüße

        1. Hallo,

          <?php
          class xml
          {
          var $parser;

          function xml()
          {
          $this->parser = xml_parser_create();
          xml_set_object($this->parser, $this);
          xml_set_element_handler($this->parser, "tag_open", "tag_close");
          xml_set_character_data_handler($this->parser, "cdata");
          }

          Die Klasse heißt xml, aber wo zum Teufel wird denn die funktion xml aufgerufen, bin ich blind? ;o)

          Oben.

          Und wie kann ich das so modifizieren, dass ich eine xml datei mit mehreren Einträgen nutzen kann???

          Du musst PHP sagen was er mit dem Inhalt von $tag machen soll.

          Mach dir die Mühe und lese das Handbuch zu diesen Funktionen.

          Bis bald,
          Sascha

    2. Hi,

      und es sollt unter php 4 und 5 laufen...
      und ich würd gern auf apis wie dom oder simple-xml verzichten...

      dann ran ans programmieren. Ist gar nicht so schwer, zumal wenn Du das Datenformat fest vorgibst, brauchst Du gar keinen vollwertigen xml-Parser zu basteln, sondern kommst auch noch mir einfachen Stringfunktionen aus.

      freundliche Grüße
      Ingo

  2. Hallo,

    Nun möchte ich mit php und dem xmlparser gern die gewünschen Baujahrgänge
    und vorselektierten Hersteller, z.B. BMW auslesen, ohne die ganze xml Datei
    vorher in ein Array zu schreiben, aller xml_parse_into_struct()

    Schau dir xml_set_element_handler() an.

    Anmerkung:

    Inhalt nutzen:

    <BMW>
            3er
            5er
            7er
         </BMW>
         <Audi>
            6er
            8er
         </Audi>

    Diese Weise finde ich problematisch: Setze die Bauarten lieber in weitere Elemente, da mit das XML wohlgeformt ist.

    <BMW>
    <model>3er</model>
    <model>5er</model>
    <model>7er</model>
    </BMW>
    usw.

    Es beeinflusst das Problem jedoch wenig, allerdings kannst du es dann über die Element Handler bewerktstelligen.

    Achja: Danke. Du hasst mich auf eine viel bessere Idee gebracht :)

    Bis bald,
    Sascha

    1. Entschuldige:

      Bin echt schon lange am suchen und bin auch über die "xml_set_element_handler()" und "xml_set_character_data_handler()"
      gestolpert, aber entweder ich bekomme alle Tags und danach alle Datablöcke oder es klappt nichts... :o(

      hatte ich überlesen.
      Es gibt allerdings kaum andere Möglichkeiten.
      Vielleicht schaust du dir das Pear-Package XML_Parser an.
      Ich weiß nicht ob es dein Problem löst... Ich bin selbst auch kein Profi.

      Grüße,
      Sascha

      1. Hallo,

        Nagut: Wenn du auf API verzichten willst musst du die Datei laden, selbst verarbeiten lassen und wieder speichern. Das wäre die einzige Möglichkeit.

        Bis bald,
        Sascha