Heim >Backend-Entwicklung >C++ >Warum gibt SelectSingleNode beim Umgang mit XML-Namespaces Null zurück?

Warum gibt SelectSingleNode beim Umgang mit XML-Namespaces Null zurück?

Barbara Streisand
Barbara StreisandOriginal
2025-01-07 21:03:48451Durchsuche

Why Does SelectSingleNode Return Null When Dealing with XML Namespaces?

Fehlerbehebung SelectSingleNodeNull-Rückgaben in XML-Dokumenten mit Namespaces

Beim Arbeiten mit XML-Dokumenten, die Namespaces enthalten, kann die Verwendung von SelectSingleNode zum Suchen nach bestimmten Knoten unerwartet null zurückgeben. Dies geschieht häufig, wenn sich das Zielelement in einem Namespace befindet, der nicht explizit in Ihrem XPath-Ausdruck deklariert ist.

Lassen Sie es uns anhand eines Beispiels veranschaulichen:

<code class="language-xml"><?xml version="1.0" encoding="utf-8"?>
<project defaulttargets="Build" toolsversion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <itemgroup>
    <compile include="clsWorker.cs"/>
  </itemgroup>
</project></code>

Wenn Sie dieses XML in ein XmlDocument laden (z. B. xmldoc), gibt xmldoc.SelectSingleNode("//Compile") null zurück. Dies liegt daran, dass sich das compile-Element innerhalb des durch xmlns deklarierten Namespace befindet. Das Entfernen des xmlns-Attributs würde das Problem lösen, aber das ist nicht immer eine praktische Lösung.

Die Lösung: Verwendung von XmlNamespaceManager

Der richtige Ansatz besteht darin, ein XmlNamespaceManager mit SelectSingleNode zu verwenden. Dadurch können Sie Namespace-Präfixe und die entsprechenden URIs angeben. So geht's:

<code class="language-csharp">XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable);
ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);</code>

Wir erstellen ein XmlNamespaceManager, fügen eine Namespace-Zuordnung hinzu („msbld“ als Präfix für den angegebenen URI) und verwenden diesen Manager dann innerhalb des SelectSingleNode-Aufrufs. Dadurch wird der Knoten compile korrekt identifiziert und abgerufen. Der Schlüssel besteht darin, das Präfix msbld:Compile im XPath-Ausdruck zu verwenden, um explizit auf den Namespace zu verweisen.

Das obige ist der detaillierte Inhalt vonWarum gibt SelectSingleNode beim Umgang mit XML-Namespaces Null zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn