質問

次のような構造を含む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 名前空間を定義する必要があるのですか?知っている人が短いコメントを落とせたら幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top