SelectSingleNodeがnullを返すのはなぜですか?
-
03-07-2019 - |
質問
次のような構造を含むXMLドキュメントを使用しています:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
現在、これをファイルからXMLドキュメントにこの方法でロードしています:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
ただし、次のコード行を実行しようとすると、この特定のドキュメントでのみ問題が発生します。
xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null
「id」という名前の属性の使用に問題があるためにこれがnullを返していると推測して正しい軌道に乗っていますか、またはコードに何かが欠けていますか?
解決
XMLファイルを使用してこれを複製することはできません
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
</event>
</Events>
</MT>
そしてコード
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");
XmlNode node = doc.SelectSingleNode("//event[@id='1']");
これは、期待どおりにnull以外のノードを返します。
更新
xmlns="example.org"
を<MT>
要素に追加した後、XPathの名前空間マネージャーを構成し、イベントに名前空間を使用する必要がありました。なんらかの理由でデフォルトのネームスペースを動作させることができませんでした。
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\test.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("e", "http://example.org");
XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager);
これを機能させようとすると、混乱してしまいました。 XmlNamespaceManagerに含まれる名前空間を見つけるためではないのに、なぜXmlNamespaceManagerがドキュメントのXmlNameTableを必要とするのですか?同様に、なぜNameTable 名前空間を定義する必要があるのですか?知っている人が短いコメントを落とせたら幸いです。
所属していません StackOverflow