ホームページ > バックエンド開発 > C++ > XML 名前空間を扱うときに SelectSingleNode が Null を返すのはなぜですか?

XML 名前空間を扱うときに SelectSingleNode が Null を返すのはなぜですか?

Barbara Streisand
リリース: 2025-01-07 21:03:48
オリジナル
393 人が閲覧しました

Why Does SelectSingleNode Return Null When Dealing with XML Namespaces?

トラブルシューティング 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

を使用する

正しいアプローチは、XmlNamespaceManagerSelectSingleNode を併用することです。これにより、名前空間プレフィックスとそれに対応する 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート