Aktueller Standort: Startseite> Neueste Artikel> Simplexml_Load_String kann den XML -Namespace nicht analysieren? Verstehe die Lösung in einem Artikel

Simplexml_Load_String kann den XML -Namespace nicht analysieren? Verstehe die Lösung in einem Artikel

gitbox 2025-08-10

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.

Das Problem erscheint wieder

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">&lt;?xml version=<span class="hljs-string">"1.0"</span></span></span><span>?&gt;
</span><span><span class="hljs-tag">&lt;<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>&gt;
  </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:table</span></span></span><span>&gt;
    </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:tr</span></span></span><span>&gt;
      </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:td</span></span></span><span>&gt;Apples</span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:td</span></span></span><span>&gt;
      </span><span><span class="hljs-tag">&lt;<span class="hljs-name">h:td</span></span></span><span>&gt;Bananas</span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:td</span></span></span><span>&gt;
    </span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:tr</span></span></span><span>&gt;
  </span><span><span class="hljs-tag">&lt;/<span class="hljs-name">h:table</span></span></span><span>&gt;
</span><span><span class="hljs-tag">&lt;/<span class="hljs-name">root</span></span></span><span>&gt;
</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">&lt;&lt;&lt;XML
&lt;?xml version="1.0"?&gt;
&lt;root xmlns:h="http://www.w3.org/TR/html4/"&gt;
  &lt;h:table&gt;
    &lt;h:tr&gt;
      &lt;h:td&gt;Apples&lt;/h:td&gt;
      &lt;h:td&gt;Bananas&lt;/h:td&gt;
    &lt;/h:tr&gt;
  &lt;/h:table&gt;
&lt;/root&gt;
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>-&gt;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.

Die Art eines Namespace

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.

So behandeln Sie den Namespaces richtig

Wir können die von der Simplexmlelement -Klasse bereitgestellten Kinder () und GetNamePaces () -Methoden verwenden, um mit Namespaces auf Elemente zuzugreifen.

Schritt 1: Holen Sie sich den Namespace

 <span><span><span class="hljs-variable">$namespaces</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</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' =&gt; 'http://www.w3.org/TR/html4/']</span></span><span>
</span></span>

Schritt 2: Zugriff auf untergeordnete Elemente im Namespace

 <span><span><span class="hljs-variable">$h</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-&gt;</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>-&gt;table-&gt;tr;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$tr</span></span><span>-&gt;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>

Weiter gehen: Verwenden Sie RegisterXPathNameSpace

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>-&gt;</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>-&gt;</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.

Zusammenfassen

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!