为什么SelectSingleNode返回null?

时间:2009-04-30 22:53:54

标签: c# xml xmldocument xml-attribute selectsinglenode

我正在使用包含类似于此的结构的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?

1 个答案:

答案 0 :(得分:10)

我无法使用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']");

这会按预期返回非空节点。

<强>更新

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需要文档中的XmlNameTable,如果不是为了找出它包含的命名空间?在中,为什么我需要定义NameTable 命名空间?如果有人知道可以发表简短评论,我会很感激。