Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] XML-Problem (https://www.delphipraxis.net/19663-%5Bphp%5D-xml-problem.html)

MathiasSimmack 6. Apr 2004 20:22


[PHP] XML-Problem
 
Hi Leute.

Ich habe ein sehr amüsantes Problem, das ich mir nicht erklären kann. Ich fummle privat gerade mit DOM-XML und PHP (4.3.4) herum. Funktioniert alles sehr gut, weil das eigentliche Parsing ja vom XSL-Stylesheet übernommen wird. Soll heißen: wer das Ding richtig programiert, benötigt streng genommen nur 4 Anweisungen, um ein XML-Dokument anzeigen zu lassen. ;)

Wie gesagt: grundsätzlich funktioniert alles. Nun will ich aber einen Fehlerfall abfangen, nämlich den, dass das Dokument nicht existiert
Code:
index.php?product=gibtsnicht.xml
DOM stellt eine Funktion zur Verfügung, mit der man ein temporäres Dokument im Speicher und gleich an die Variable übergeben kann:
Code:
$xmldoc = domxml_open_mem(
   "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n".
   "<?xml-stylesheet href=\"../product.xsl\" type=\"text/xsl\"?>\n".
   "<!DOCTYPE product SYSTEM \"../product.dtd\">\n".
   "<product type=\"doku\" sig=\"doku/fehler\" name=\"Fehler\">\n".
   [color=#ff0000]" <uppernavigation href=\"uppernav.xml\"/>\n".[/color]
   " <navigation href=\"navigation.xml\"/>\n".
   " <message>Das angegebene Dokument [b]$product[/b] wurde nicht gefunden.
\n".
   "   Benutzen Sie bitte die Navigationsleiste auf der linken Seite zur Auswahl.</message>\n".
   "</product>"
);
In der rot markierten Zeile wird ein separates XML-Dokument angegeben, das meine obere Navigationsleiste unter dem Banner enthält (wer meine Seite kennt, der weiß wovon ich rede). Mein XSL-Stylesheet macht aus der Angabe jetzt HTML-Code:
Code:
  <xsl:variable name="un" select="document(//uppernavigation/@href)"/>
  <table class="UpperNav" border="0">
    <colgroup>
      <xsl:for-each select="$un/uppernavigation/uppernav">
        <col><xsl:attribute name="width"><xsl:value-of select="@width"/></xsl:attribute></col>
      </xsl:for-each>
    </colgroup>
    <tr><xsl:for-each select="$un/uppernavigation/uppernav">
      <xsl:choose>
        <xsl:when test="./*[name()='a']"><td><xsl:apply-templates/></td></xsl:when>
        <xsl:otherwise><td class="UpperActiveNav"><xsl:apply-templates/></td></xsl:otherwise>
      </xsl:choose>
    </xsl:for-each></tr>
  </table>
Problem: Leider funktioniert es nicht mit meinem temporären Dokument. Wenn ich stattdessen auf die herkömmliche Art und Weise ein vorhandene Fehler-XML-Datei lade
Code:
if($xmldoc = domxml_open_file("$currentdir\\404.xml")) {
   $root = $xmldoc->document_element();
   $node = $root->get_elements_by_tagname("message");
   $b = $node[0]->get_elements_by_tagname("b");
   $txt = $xmldoc->create_text_node($product);

   // ich habe einen leeren [b][/b]-Knoten in der Datei,
   // der hier mit dem Namen der nicht vorhandenen
   // Datei gefüllt wird
   // (nur falls ihr wissen wolltet, was das soll ... ;))
   $b[0]->append_child($txt);
}
dann sehe ich auch die obere Navigationsleiste, obwohl der Inhalt der Fehlerdatei exakt dem o.g. temporären Dokument entspricht.

Kann mir das jemand erklären? :gruebel:

mirage228 7. Apr 2004 08:29

Re: [PHP] XML-Problem
 
Eventuell stimmt in der rot markierten Zeile die Pfadangabe nicht und PHP sucht das XML Document in einem falschen Verzeichnis.
Im unteren Code hast du auch $currentdir stehen, probier mal das in die obere anweisung einzusetzen.

mfG
mirage228

MathiasSimmack 7. Apr 2004 09:05

Re: [PHP] XML-Problem
 
Ich habe inzwischen eine andere Theorie. :) Ich glaube, das XSL-Stylesheet hat ein Problem mit dieser Anweisung:
Code:
<xsl:variable name="un" select="document(//uppernavigation/@href)"/>
weil der XML-Code im Fehlerfall ja nicht aus einem Dokument (sprich: aus einer vorhandenen Datei) kommt sondern dynamisch erzeugt wird. Ich habe das Stylesheet um ein neues Template namens "UpNavigation" erweitert. Im Normalfall (wenn man die XML-Datei direkt via Doppelklick startet) fällt das nicht weiter ins Gewicht, weil dann die o.g. Anweisung funktioniert. Das Skript besitzt jetzt aber eine eingebaute Funktion namens "Patch_UpperNav()", die den Knoten
Code:
  <uppernavigation href="uppernav.xml"/>
ausliest, die Datei öffnet und in den neuen "UpNavigation"-Knoten umbaut. Danach wird der "uppernavigation"-Knoten entfernt, und das Dokument kann geparst werden.

Voilà.
Vielleicht ein bisschen umständlich, aber es funktioniert. ;)

Aber ich will die Sache sowieso noch ein wenig umbauen, damit es etwas einfacher wird. Und generell freue ich mich schon drauf, wenn diese XML-Bibliothek auch XPath kann. Im Moment ist das Handling mit den Knoten doch ein wenig umständlich. Kein Vergleich zu MS-XML. *seufz*

Ich kann leider keine Demo anbieten, denn auf dem Server, auf dem meine Homepage liegt, gibt´s zwar PHP, aber diese XML-DOM-Bibliothek ist nicht installiert. Deswegen verursacht das Skript immer eine Fehlermeldung. Die Dateien können darum bisher auch nur vom IE geparst werden. Andere Browser benötigen eben das PHP-Skript als Mittelsmann.


Gruß.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz