Thorsten Beuth: PHP und XML, beides vereinbar?

Hallo!

Ich habe da eine Frage zu PHP und XML: Mögen die sich nicht? Es ist nämlich so, dass ich momentan versuche etwas XML zu lernen, weil es teilweise doch Vorzüge hat. Aber wenn ich versuche irgendwelche <?XML ?> oder <?XSL ?> Befehle zu machen, fühlt sich der Apache angesprochen PHP zu interpretieren und spuckt deshalb dauernd Fehler am laufenden Band aus.

Deshalb so ein paar fragen:

1. Kann man PHP und XML überhaupt kombinieren?!
2. Wenn ja, hat da wer Erfahrungen oder Tipps, die er weitergeben kann?
3. Kennt jemand vll Seiten auf denen Hilfestellung gegeben werden?

mfg
Thorsten

  1. Hallo Thorsten,

    mmh...

    frankx

    1. Danke Frankx,

      ich hab unter "XML und PHP kombinieren" nachgeschaut und nix gefunden ... dummes "kombinieren".

      mfg
      Thorsten

  2. Hello out there!

    Aber wenn ich versuche irgendwelche <?XML ?> oder <?XSL ?> Befehle zu machen, fühlt sich der Apache angesprochen PHP zu interpretieren

    Was man ihm verbieten kann/sollte. http://www.php-faq.de/q/q-fehler-shorttags-xml.html

    See ya up the road,
    Gunnar

    --
    “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
    1. Hallo Gunnar!

      Ich habe den neusten Xampp vorhin installiert und damit auch nun endlich PHP 5. Das hatte das zwar nicht geholfen, aber mit deinem Tipp konnte ich nun endlich dem Parser XML vorgaukeln.

      Was aber dennoch stört, ist, dass es nicht wirklich funktioniert.

      Ich habe zum Beispiel eine Datei "gruss.php":

        
      <?xml version="1.0" encoding="ISO-8859-1"?>  
      <?php  
      echo 'Test';  
      ?>  
      <!DOCTYPE gruss SYSTEM "gruss.dtd">  
      <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>  
      <Root>  
      <Ueberschrift>Kapitel1</Ueberschrift>  
      </Root>  
      
      

      Aber dort werden die XSL Styles nicht übernommen, obwohl sie in der entsprechenden Datei mit der Endung XML funktionieren. Dafür funktioniert in der XML Datei das PHP nicht: Es wird einfach nur so als Text dargestellt. Also, wie geht der Trick, das beides zusammen funktioniert?

      Oder mache ich hier den komplett falschen Ansatz?

      mfg
      Thorsten

      1. Hallo Thorsten.

        Dafür funktioniert in der XML Datei das PHP nicht: Es wird einfach nur so als Text dargestellt.

        Du sendest ja auch offenbar keinen header.
        Tue dies vor der allerersten Ausgabe (also sogar noch vor der XML-Deklaration) und sende den passenden http://de.selfhtml.org/diverses/mimetypen.htm#uebersicht@title=MIME-Typ.

        Einen schönen Samstag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        mathbr:del.icio.us/ mathbr:w00t/
        1. Oh Ashura,

          tausend dank!

          Endlich kann das "spielen" ... wie ich das lernen immer nenne ... beginnen ;)

          mfg
          Thorsten

      2. Hallo Thorsten,

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <?php
        echo 'Test';
        ?>
        <!DOCTYPE gruss SYSTEM "gruss.dtd">
        <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>
        <Root>
        <Ueberschrift>Kapitel1</Ueberschrift>
        </Root>

        
        > Oder mache ich hier den komplett falschen Ansatz?  
          
        ja, ich glaube schon. Was dieser PHP-Code erzeugt, ist kein gültiges XML.  
        Erstens steht noch vor dem DOCTYPE ein "Test" so hilflos in der Gegend rum, das an der Stelle \_überhaupt nichts\_ verloren hat.  
        Zweitens muss das root-Element in deiner XML-Datei "gruss" heißen - so steht's in deinem DOCTYPE. Dein root-Element heißt aber "Root".  
        Also ein gültiges XML-Dokument solltest du als Grundlage schon haben...  
          
        So long,  
         Martin  
        
        -- 
        Um die Wahrheit zu erfahren, muss man den Menschen widersprechen.  
          (George Bernhard Shaw)  
          
        
        
        1. Hallo Martin,

          abschließend nun, wie man es richtig machen muss.

          Hier die PHP Datei:

          [Code lang=php]
          <?php header('Content-type: application/xml'); ?>
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <!DOCTYPE gruss SYSTEM "gruss.dtd">
          <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>
          <Root> <!-- Es muss ein Root Tag angeben werden, sonst gibts Fehler! -->
          <?php
          include "gruss.xml";
          echo"\n"; // <- wichtig, weil sonst das in einer Zeile geschrieben wird, und dann gibts Fehler!
          include "gruss.xml";
          ?>
          </Root>
          [/Code]

          hier eine XML Datei, wie sie aussehen müsste

          [Code lang=xml]
          <Root1>
          <Ueberschrift>Kapitel1</Ueberschrift>
          <Absatz>US-Präsident Bush hat Regierungen auf der ganzen Welt aufgefordert, der wegen der Mohammed-Karikaturen entbrannten Gewalt ein Ende zu bereiten. EU-Ratspräsident Schüssel appellierte an alle Seiten, "die Spirale der gegenseitigen Provokationen zu beenden". Unterdessen veröffentlichte ein französisches Satire-Blatt eine neue Mohammed-Karikatur.</Absatz>
          </Root1>
          [/Code]

          Die XML Datei darf keine XML Spezifikationen enthalten, sonst werden Fehler ausgespuckt. Einzig eine Spezifikation darf in der PHP Datei stehen.

          So Leute, viel Spaß beim Programmieren ;)

          mfg
          Thorsten

          1. Hallo,

            abschließend nun, wie man es richtig machen muss.

            Erlaubst mir an dieser Stelle Widersprch einzulegen? --> *

            Hier die PHP Datei:
            <?php header('Content-type: application/xml'); ?>
            <?xml version="1.0" encoding="ISO-8859-1"?>
            <!DOCTYPE gruss SYSTEM "gruss.dtd">
            <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>
            <Root> <!-- Es muss ein Root Tag angeben werden, sonst gibts Fehler! -->

            * --> Es muss ein "root" sprich Wurzelelement geben.
            Du hast für dieses Element durch die Angabe im DOCTYPE "gruss" vorgesehen.
            Dementsprechend hat dein XML mit dem root- oder Wurzelelement <gruss> zu beginnen.

            Für weitere Erlärungen siehe:
            http://de.selfhtml.org/xml/regeln/dokumenttypdeklaration.htm

            <?php
            include "gruss.xml";
            echo"\n"; // <- wichtig, weil sonst das in einer Zeile geschrieben wird, und dann gibts Fehler!
            include "gruss.xml";
            ?>
            </Root>

            Jetzt wäre es wichtig zu wissen, was in diesem geheimnisvollen gruss.xml steht. Zumindest darf gruss.xml keine wollwertige XML-Datei (keine XML-Deklaration, keine DOCTYPE-Angabe) sein, sondern nur ein XML-Fragmant, dessen Strutur sich aber dennoch an die DTD hält. --> siehe weiter unter bei: **
            Die DTD ist an sich aber hier mehr oder weniger irrelevant, denn "expat" (ein XML-Parser in PHP) kümmert sich nicht um die DTD. Sprich, es findet keine Validierung statt. Deshalb hast du auch keine Fehlermeldungen dazu (<Root> satt <gruss>) bekommen.

            hier eine XML Datei, wie sie aussehen müsste

            [Code lang=xml]
            <Root1>
            <Ueberschrift>Kapitel1</Ueberschrift>
            <Absatz></Absatz>
            </Root1>
            [/Code]

            Tja ... das ist eine XML-Datei wie sie nicht sein darf.
            Wohin ist denn dein (an sich schon falsches) <Root> verschwunden und wie wurde daraus ein <Root1>. Oder ist das der Inhalt von gruss.xml?

            Die XML Datei darf keine XML Spezifikationen enthalten, sonst werden Fehler ausgespuckt. Einzig eine Spezifikation darf in der PHP Datei stehen.

            ** --> klar, die Gründe dafür habe ich dir weiter oben erklärt.

            Eigentlich darf keine einzige XML-Datei an sich _die_ XML-Spezifikation enthalten, bist auf die XML-Datei der XML-Spezifikation selbst: http://www.w3.org/TR/2004/REC-xml-20040204/REC-xml-20040204.xml

            Was du meinst ist die die XML-Deklaration: http://de.selfhtml.org/xml/regeln/xmldeklaration.htm
            Das mag jetzt dir pingelig erschienen, jedoch solltest du von Anfang an die richtigen Bezeichnungen lernen und verwenden, damit sprast du dir spätere Missverständnisse und Ärger.

            Lese mal ein weniger unter http://de.selfhtml.org/xml/index.htm

            Grüße
            Thomas

          2. Hello out there!

            abschließend nun, wie man es richtig machen muss.

            Was du da schreibst, ist weit von dem entfernt, „wie man es richtig machen muss.“

            Was mir nicht, dafür aber Martin aufgefallen war: In der Doctype-Angabe MUSS der Name des Wurzelelements stehen.

            <!DOCTYPE foo>  <!-- hier "foo" -->  
            <foo>                          <!-- hier AUCH "foo" -->  
              <bar/>  
            </foo>
            

            So Leute, viel Spaß beim Programmieren ;)

            Solange du dein Problem nicht verständlich machst, ist unser Spaß anderer Natur. ;-)

            See ya up the road,
            Gunnar

            --
            “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)
      3. Hello out there!

        Hallo Gunnar!

        Ich habe den neusten Xampp vorhin installiert und damit auch nun endlich PHP 5. Das hatte das zwar nicht geholfen, aber mit deinem Tipp konnte ich nun endlich dem Parser XML vorgaukeln.

        Was aber dennoch stört, ist, dass es nicht wirklich funktioniert.

        Ich habe zum Beispiel eine Datei "gruss.php":

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <?php
        echo 'Test';
        ?>
        <!DOCTYPE gruss SYSTEM "gruss.dtd">
        <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>
        <Root>
        <Ueberschrift>Kapitel1</Ueberschrift>
        </Root>

        Das gibt invalides XML. Was soll das 'Test' zwischen XML-Deklaration und Doctype-Angabe?

        Sowas vielleicht? (Wie Ashura sagte, evtl. noch einen Header dazugeben.)

        [code lang=xml]<?xml version="1.0" encoding="ISO-8859-1"?>
        <!DOCTYPE gruss SYSTEM "gruss.dtd">
        <?xml-stylesheet type="text/xsl" href="gruss.xsl" ?>
        <Root>
        <Ueberschrift>
        <?php
        [code lang=php]echo 'Kapitel1';

        ?>  
        </Ueberschrift>  
        </Root>[/code]  
          
        See ya up the road,  
        Gunnar
        
        -- 
        “Remember, in the end, nobody wins unless everybody wins.” (Bruce Springsteen)