Bei Verwendung von PHP zur Verarbeitung von XML -Daten ist SimplexML_Load_String eine sehr bequeme Funktion, die XML -Zeichenfolgen in Objektstrukturen für einfachen Zugriff und Manipulation umwandelt. Viele Entwickler stoßen jedoch auf ein gemeinsames Problem beim Umgang mit XML mit Namespaces: Simplexml_Load_String scheint im Namespace nicht korrekt zu erkennen oder zugreifen.
In diesem Artikel werden die Ursachen dieses Problems eingehend untersucht und klare Lösungen bereitgestellt, die Ihnen helfen, sie in einem Artikel zu verstehen und zu lösen.
Schauen wir uns zunächst ein Beispiel an, bei dem es sich um eine XML -Zeichenfolge handelt, die den Namespace enthält:
<span><span><span class="hljs-meta"><?xml version=<span class="hljs-string">"1.0"</span></span></span><span>?>
</span><span><span class="hljs-tag"><<span class="hljs-name">root</span></span></span><span> </span><span><span class="hljs-attr">xmlns:h</span></span><span>=</span><span><span class="hljs-string">"http://www.w3.org/TR/html4/"</span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:table</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:tr</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:td</span></span></span><span>>Apples</span><span><span class="hljs-tag"></<span class="hljs-name">h:td</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">h:td</span></span></span><span>>Bananas</span><span><span class="hljs-tag"></<span class="hljs-name">h:td</span></span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">h:tr</span></span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">h:table</span></span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">root</span></span></span><span>>
</span></span>
Wenn wir versuchen, mit dem folgenden Code zu analysieren:
<span><span><span class="hljs-variable">$xmlString</span></span><span> = <span class="hljs-string"><<<XML
<?xml version="1.0"?>
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
</root>
XML</span>;
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$xmlString</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$xml</span></span><span>->table);
</span></span>
Sie werden feststellen, dass $ XML-> Tabelle keine Ergebnisse zurückgibt. Dies liegt daran, dass simplexml_load_string keine vorangestellten Namespace -Tags (z. B. H: Tabelle ) behandelt.
In XML werden Namespaces verwendet, um Elementnamenkonflikte zu vermeiden. Beispielsweise ist H in H: Tabelle tatsächlich ein Referenzpräfix, das auf XMLNS zeigt: H = "http://www.w3.org/tr/html4/" . Dies macht XML erweiterbarer und organisierter, bringt aber auch zusätzliche Schwierigkeiten an Parsen mit.
Wir können die von der Simplexmlelement -Klasse bereitgestellten Kinder () und GetNamePaces () -Methoden verwenden, um mit Namespaces auf Elemente zuzugreifen.
<span><span><span class="hljs-variable">$namespaces</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getNamespaces</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-comment">// Ausgangsergebnis:['h' => 'http://www.w3.org/TR/html4/']</span></span><span>
</span></span>
<span><span><span class="hljs-variable">$h</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">children</span></span><span>(</span><span><span class="hljs-variable">$namespaces</span></span><span>[</span><span><span class="hljs-string">'h'</span></span><span>]);
</span><span><span class="hljs-variable">$tr</span></span><span> = </span><span><span class="hljs-variable">$h</span></span><span>->table->tr;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$tr</span></span><span>->td </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span> . PHP_EOL;
}
</span></span>
Ausgangsergebnis:
<span><span><span class="hljs-attribute">Apples</span></span><span>
Bananas
</span></span>
Wenn Sie die XPath -Query -Methode verwenden, um Daten zu erhalten, können Sie den Namespace über die RegisterxpathNameSpace -Methode registrieren:
<span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$xmlString</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">registerXPathNamespace</span></span><span>(</span><span><span class="hljs-string">'h'</span></span><span>, </span><span><span class="hljs-string">'http://www.w3.org/TR/html4/'</span></span><span>);
</span><span><span class="hljs-variable">$tds</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">xpath</span></span><span>(</span><span><span class="hljs-string">'//h:td'</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$tds</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$td</span></span><span> . PHP_EOL;
}
</span></span>
Dieser Ansatz ist nicht nur semantisch klar, sondern auch flexibler, wenn es sich um komplexe XML -Strukturen handelt.
Wenn Sie SimplexML_Load_String verwenden, um XML mit dem Namespace zu analysieren, stürzen Sie sich nicht, dass auf die untergeordneten Elemente nicht zugegriffen werden können, nicht zu vermuten, dass das XML falsch ist. Verstehen und nutzen Sie die Methoden von Kindern () , GetNamePaces () und RegisterXPathNamespace () , und Sie werden die durch Namespaces verursachten Probleme leicht knacken.
Obwohl die Handhabung von Namespaces etwas umständlich ist, sobald es gemeistert wird, kann es sich nahtlos mit verschiedenen standardisierten XML -Datenquellen verbinden und die Integrationsfunktionen von PHP -Anwendungen verbessern. Ich hoffe, dieser Artikel kann Ihnen helfen, dieses Problem gründlich zu verstehen!