Fehlerbehebung SelectSingleNode
Null-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!