Andi: PHP Parsen

Hi!

Also ich möchte eine XML-Datei parsen. ich mache es folgendermaßen:

$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $vals, $index);
xml_parser_free($parser);

Aber er gibt mir immer das XML im struct zurück, obwohl die XML Datei mit dem Schema nicht übereinstimmt.

Muss man hier etwas angeben?

Hat jemand eine Idee?

Grüsse
Andi

  1. Hallo.

    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, $data, $vals, $index);
    xml_parser_free($parser);

    Aber er gibt mir immer das XML im struct zurück,

    http://at.php.net/xml_parse_into_struct

    obwohl die XML Datei mit dem Schema nicht übereinstimmt.

    Mit welchem Schema?

    Grüße
    Thomas

    1. Hi!

      Meine XML:

      <?xml version='1.0' encoding='UTF-8'?>
       <Test xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='C:/Documents and Settings/andreas/My Documents/Test.xsd'>
       <TestList>
         <Test1>Hallo</Test1>
         <Test2>Es</Test2>
       </TestList>
       </Test>

      Mein Schema:

      <?xml version="1.0" encoding="UTF-8"?>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
       <xs:element name="Test">
        xs:annotation
         xs:documentationComment describing your root element</xs:documentation>
        </xs:annotation>
        xs:complexType
         xs:sequence
          <xs:element name="TestList">
           xs:complexType
            xs:sequence
             <xs:element name="Test1"/>
             <xs:element name="Test2"/>
             <xs:element name="Test3"/>
            </xs:sequence>
           </xs:complexType>
          </xs:element>
         </xs:sequence>
        </xs:complexType>
       </xs:element>
      </xs:schema>

      Und wenn ichs jetzt Parse macht er mir das ohne Probleme! Dürfte aber nicht gehen

      Grüsse!
      Andi

      1. Hallo,

        Und wenn ichs jetzt Parse macht er mir das ohne Probleme! Dürfte aber nicht gehen

        Warum nicht?
        Ich sehe nicht, dass es irgenwo ein Schema-Prozessor eingebunden wäre.
        SimpleXML hat(te) eine validate_schema_file() Methode, aber die PHP-Doku ist wie üblich wieder alles andere als nutzbar.

        Siehe auch http://bugs.php.net/bug.php?id=25756

        Oder verwendest du LibXSLT?

        Grüße
        Thomas

        1. Hi THomas!

          SimpleXML hat(te) eine validate_schema_file() Methode, aber die PHP-Doku ist wie üblich wieder alles andere als nutzbar.

          Naja, ist vielleicht nicht unbedingt zu verallgemeinern. Stimmt schon, der XML-Teil der Doku war schon immer schlecht. Aber ich denke das wird sich ändern, PHP5 ist ja noch nicht draußen, das wird noch dauern...

          Dafür gibt es ein paar Infos auf http://www.zend.com/php5/, z.B.: http://www.zend.com/php5/articles/php5-xmlphp.php#Heading13

          Siehe auch http://bugs.php.net/bug.php?id=25756

          Dies war lediglich ein Fehler in der genannten Methode, der AFAIK in beta2 behoben war, nur wurde die Methode glaube ich in beta4 oder RC1 komplett rausgeschmissen, es gab auf der Internals-Liste ein paar Argumente gegen diese Methode(n), z.B. dass die Validierung nur beim Root-Element Sinn macht... die Entscheidung habe ich allerdings nicht mitbekommen.

          Zu diesem Zeitpunkt war PHP5 faktisch noch im Alpha-Stadium der Entwicklung, im Changelog zu beta4 steht:

          Completely overhauled SimpleXML extension. (Marcus, Rob, Sterling)

          Siehe auch: http://news.php.net/article.php?group=php.xml.dev&article=367

          Viele Grüße
          Andreas

          --
          SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/
          1. Hallo andreas,

            SimpleXML hat(te) eine validate_schema_file() Methode, aber die PHP-Doku ist wie üblich wieder alles andere als nutzbar.
            Naja, ist vielleicht nicht unbedingt zu verallgemeinern. Stimmt schon, der XML-Teil der Doku war schon immer schlecht. Aber ich denke das wird sich ändern, PHP5 ist ja noch nicht draußen, das wird noch dauern...

            Es "könnte" u. bes. U. zutreffen, dass ich immer nur die XML-Sachen gesucht habe ;-) , aber ich weiss ganz genau, dass es jedesmal der Fall war/ist wenn ich etwas im Doku suche. Und das nicht seit vorgestern.

            Dann muss ich wirklich in mühsamer Sucharbeit aus zig Quellen die kleinen Fetzen von Informationen zusammentragen.
            Wenn ein Doku _so_ gestaltet ist, ist es leider unbrauchrauchbar. [1]

            Siehe auch: http://news.php.net/article.php?group=php.xml.dev&article=367

            Mal ehrlich: wie lange hast du gebraucht diese Info zu finden?

            [1] Ich weiss, dass Entwickler per se sehr ungern Dokus schreiben, bzw. dass diese Arbeit dümmster weise als geringfügig, - wertig betrachtet und deshalb ungern gemacht wird. Was aber letztendlich  essential ist.

            "The documentation is lagging behind extension development. [...] The old PHP 4 DOM XML "experimental" extension is  deprecated and will not be supported in PHP 5. There are some changes  between the old and new DOM extensions, so you will need to port your  code; however, the new DOM extension is *much* better than the old one,  so it's worth the time and effort."

            Das ist aber wieder etwas was mich stört. _Jede_ miniversion von PHP  behandelt dinge anders (dann heisst es in den Kommetaren "das war mal so in pre alfa pre beta pre candidat relise Version  noch so, aber in der aktuellen pre alfa rc relise pre beta candidat ist es anders"). Sachen werden rausgenommen, geändert, etc. etc. und kein Wort darüber im Manual. Und es heisst natürlich auch immer "in der nächsten Version wird alles besser". Klar wird das. Und zwar _immer_ in der _nächsten_ Version.

            So. Das musste auch mal gesagt werden! ;-)

            Grüße
            Thomas

            1. Hi Thomas!

              Es "könnte" u. bes. U. zutreffen, dass ich immer nur die XML-Sachen gesucht habe ;-) ,

              Wie kommt denn sowas... ;-)

              aber ich weiss ganz genau, dass es jedesmal der Fall war/ist wenn ich etwas im Doku suche. Und das nicht seit vorgestern.

              Ja, die XML-Doku ist nicht gerade ein Vorzeige-.Kapitel des Manuals, das sieht eigentlich jeder so ;-)

              Dann muss ich wirklich in mühsamer Sucharbeit aus zig Quellen die kleinen Fetzen von Informationen zusammentragen.
              Wenn ein Doku _so_ gestaltet ist, ist es leider unbrauchrauchbar.

              domxml war bis zuletzt experimentell. Das soll sich dem php5-Release ändern. Sind wir mal gespannt wie das in Zukunft aussieht ;-)

              Aber wenn man weiß wo man suchen muss kommt man schon irgendwie klar, ich empfehle http://www.zend.com/php5/ und http://talks.php.net/, da findet sich schon so einiges.

              Siehe auch: http://news.php.net/article.php?group=php.xml.dev&article=367

              Mal ehrlich: wie lange hast du gebraucht diese Info zu finden?

              Zugegeben, das was ich gesucht habe habe ich nicht gefunden, und der Link ist mir nur so nebenbei über den Weg gelaufen ;-)

              [1] Ich weiss, dass Entwickler per se sehr ungern Dokus schreiben, bzw. dass diese Arbeit dümmster weise als geringfügig, - wertig betrachtet und deshalb ungern gemacht wird. Was aber letztendlich  essential ist.

              Ja, das ist wohl ein berechtigter Kritikpunkt. Allerdings scheinst Du das Pech zu haben Dich überwiegend mit Extensions zu beschäftigen, die noch (und das schon lange) in der Entwicklung sind, z.B. hat sich domxml mehrmals erheblich verändert, und wurde halt immer als experimentell gekennzeichnet. Wenn ich noch dabei bin an einer Software zu programmieren, und ich weiß, da werde sich noch einige Dinge ändern, dann will ich halt auch nicht jede Änderung umfassend dokumentieren. Aber das geht auch schon viel zu lange so, daher war neben ZE2 die XML-Unterstützung einer der Hauptpunkte bei der Entwicklung von PHP5. Die XML-Extensions sind ja bis zum Ende von PHP4 nie wirklich aus dem "experimentell-Status" heraus gekommen.

              Daher wurden die Erweiterungen jetzt alle neu geschrieben, alle basierend auf libxml2:

              * ext/xml (SAX parsing)
                  * ext/dom (W3C DOM standard)
                  * ext/simplexml (simple interface to XML documents)
                  * ext/xmlreader (XML Pull parser, der vermutlich erstmal in PECL bleibt)
                  * ext/xsl
                  * ext/soap

              Und wenn die alle mit dem Release von PHP5 stabil implementiert sind, also nicht mehr experimentell, dann hat PHP ja eine XML-Unterstützung, die sich durchaus sehen lassen kann, oder?

              Noch zu simplexml - es kamen berechtigte Zweifel auf, ob denn die Methoden darin alle überhaupt so viel Sinn machen, und da hat man sich halt gedacht - jetzt ist PHP5 noch in einem Stadium, in dem man so tiefe Korrekturen noch ohne Rücksicht auf Verluste vornehmen kann, später wird sowas erheblich unangenehmer.

              Man kann ja simplexml-Objekte nach dom übergeben, und mit dom-Methoden validieren... oder eben direkt mit dom.

              "The documentation is lagging behind extension development. [...] The old PHP 4 DOM XML "experimental" extension is  deprecated and will not be supported in PHP 5. There are some changes  between the old and new DOM extensions, so you will need to port your  code; however, the new DOM extension is *much* better than the old one,  so it's worth the time and effort."

              Das ist aber wieder etwas was mich stört. _Jede_ miniversion von PHP  behandelt dinge anders (dann heisst es in den Kommetaren "das war mal so in pre alfa pre beta pre candidat relise Version  noch so, aber in der aktuellen pre alfa rc relise pre beta candidat ist es anders"). Sachen werden rausgenommen, geändert, etc. etc. und kein Wort darüber im Manual. Und es heisst natürlich auch immer "in der nächsten Version wird alles besser". Klar wird das. Und zwar _immer_ in der _nächsten_ Version.

              Du warst zur falschen Zeit am falschen Ort ;-) Du hättest Dich ja auch mit plaintext, Datenbanken, Sessions... die Zeit vertreiben können - bis die endlich so weit sind ;-)

              So. Das musste auch mal gesagt werden! ;-)

              Zum Glück habe ich bisher eigentlich fast nix mit PHPs XML-Kram zu tun gehabt, daher sehe ich das vermutlich deutlich entspannter als Du ;-)

              Noch ein Workshop zum Thema XML in PHP5: http://php5.bitflux.org/phpconf2004/title.php, zusammen mit dem Kram bei Zend steht da ja schon ne Menge drin.

              Aber wieder symptomatisch: http://php5.bitflux.org/phpconf2004/slide_106.php ;-)

              Viel Grüße
              Andreas

              --
              SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/
              1. Hallo ;-)

                domxml war bis zuletzt experimentell. Das soll sich dem php5-Release ändern. Sind wir mal gespannt wie das in Zukunft aussieht ;-)

                Ich auch, sogar sehr, denn bisher war es doch recht mühsam mit PHP und XML/XSLT.

                [1] Ich weiss, dass Entwickler per se sehr ungern Dokus schreiben, bzw. dass diese Arbeit dümmster weise als geringfügig, - wertig betrachtet und deshalb ungern gemacht wird. Was aber letztendlich  essential ist.
                Ja, das ist wohl ein berechtigter Kritikpunkt. Allerdings scheinst Du das Pech zu haben Dich überwiegend mit Extensions zu beschäftigen,

                Ich weiss, immer diese Exoten, die nur auf "Extensionen" aus sind ;-)

                »»Wenn ich noch dabei bin an einer Software zu programmieren, und ich weiß, da werde sich noch einige Dinge ändern, dann will ich halt auch nicht jede Änderung umfassend dokumentieren.

                Jein. Ich mache das ja auch und es ist immer ein erheblicher Aufwand bzw. Grund für "Ärger" wenn man später nachvollziehen muss was und wo geändert wurde. Es reicht mal, wenn ein neues Attribut in die XML-Strukturen eingefügt wird: dokumentiere ich das nicht, fragen sich dann später alle (und ich mich auch) welche Funktionen doch diesem Attribut zugedacht waren, das selbe gilt dann meinen XSL-Sheets und bei deren Komplexität ist es wirklich zwingend dass Änderungen dokumentiert werden.  Das selbe gilt für die User-Manuals. Klar mitten in der Entwicklung verspüre ich auch nicht die große Lust alles niederzuchreiben, aber es stellt sich immer wieder heraus, das das notwendig ist. Deshalb "ärgert" mich wohl auch so sehr der Teil im PHP Manual.

                Die XML-Extensions sind ja bis zum Ende von PHP4 nie wirklich aus dem "experimentell-Status" heraus gekommen.

                Und wenn die alle mit dem Release von PHP5 stabil implementiert sind, also nicht mehr experimentell, dann hat PHP ja eine XML-Unterstützung, die sich durchaus sehen lassen kann, oder?

                Ja, mit libxml und libxslt wird es wirklich zu einem interessanten Werkzeug werden.

                Man kann ja simplexml-Objekte nach dom übergeben, und mit dom-Methoden validieren... oder eben direkt mit dom.

                Validieren _mit_ DOM  wird es ja so nicht gehen. Es braucht trotzdem noch etwas was die Regel z.B. aus einem XML-Schema versteht (z.B. libxml).

                Das ist aber wieder etwas was mich stört. [...]
                Du warst zur falschen Zeit am falschen Ort ;-) Du hättest Dich ja auch mit plaintext, Datenbanken, Sessions... die Zeit vertreiben können - bis die endlich so weit sind ;-)

                Jaja ;-)

                Grüße
                Thomas

                1. Hi Thomas!

                  Validieren _mit_ DOM  wird es ja so nicht gehen. Es braucht trotzdem noch etwas was die Regel z.B. aus einem XML-Schema versteht (z.B. libxml).

                  Natürlich, aber es wird in der dom-Extension eine, oder eigentlich 3 hierfür vorgesehene Methoden geben, die dann natürlich libxml2 verwenden, aber davon merkt der User ja nichts ;-)

                  Viele Grüße
                  Andreas

                  --
                  SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/