トラブルシューティング SelectSingleNode
名前空間を含む XML ドキュメントで Null が返される
名前空間を含む XML ドキュメントを操作する場合、SelectSingleNode
を使用して特定のノードを検索すると、予期せず null
が返されることがあります。これは、ターゲット要素が XPath 式で明示的に宣言されていない名前空間内にある場合によく発生します。
例で説明してみましょう:
<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>
この XML を XmlDocument
(例: xmldoc
) にロードすると、xmldoc.SelectSingleNode("//Compile")
は null
を返します。これは、compile
要素が xmlns
で宣言された名前空間内にあるためです。 xmlns
属性を削除すると問題は解決しますが、それが必ずしも現実的な解決策であるとは限りません。
解決策: XmlNamespaceManager
正しいアプローチは、XmlNamespaceManager
と SelectSingleNode
を併用することです。これにより、名前空間プレフィックスとそれに対応する URI を指定できます。 その方法は次のとおりです:
<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>
XmlNamespaceManager
を作成し、名前空間マッピング (指定された URI のプレフィックスとして「msbld」) を追加して、SelectSingleNode
呼び出し内でこのマネージャーを使用します。 これにより、compile
ノードが正しく識別され、取得されます。 重要なのは、XPath 式で接頭辞 msbld:Compile
を使用して、名前空間を明示的に参照することです。
以上がXML 名前空間を扱うときに SelectSingleNode が Null を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。