![]() |
[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:
DOM stellt eine Funktion zur Verfügung, mit der man ein temporäres Dokument im Speicher und gleich an die Variable übergeben kann:
index.php?product=gibtsnicht.xml
Code:
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:
$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>" );
Code:
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
<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>
Code:
dann sehe ich auch die obere Navigationsleiste, obwohl der Inhalt der Fehlerdatei exakt dem o.g. temporären Dokument entspricht.
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); } Kann mir das jemand erklären? :gruebel: |
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 |
Re: [PHP] XML-Problem
Ich habe inzwischen eine andere Theorie. :) Ich glaube, das XSL-Stylesheet hat ein Problem mit dieser Anweisung:
Code:
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
<xsl:variable name="un" select="document(//uppernavigation/@href)"/>
Code:
ausliest, die Datei öffnet und in den neuen "UpNavigation"-Knoten umbaut. Danach wird der "uppernavigation"-Knoten entfernt, und das Dokument kann geparst werden.
<uppernavigation href="uppernav.xml"/>
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 ![]() 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