为什么 SelectSingleNode 返回 null?

6

我正在处理一个包含类似以下结构的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 

我猜想你认为这段代码返回null是因为使用了一个名为"id"的属性,或者我在代码中漏掉了什么?请问我的猜想是否正确?

1个回答

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']");

这返回了一个非空节点,正如预期的那样。

更新

<MT>元素中添加xmlns="example.org"后,我不得不为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 命名空间?如果有人知道,能否简短评论一下,谢谢。


回答自己的问题。XmlNameTable 用于优化字符串比较,我猜你可以给 XmlNamespaceManager 一个现有的名称表是因为这样可以快速比较 XmlDocument 元素,因为它们共享 NameTable。 - Mikko Rantanen
你的更新看起来很有道理。我试图发布XML的缩写形式,却忘记了发布命名空间。谢谢你花费额外的时间尝试解决这个问题。一旦我从原始XML中删除了命名空间,一切都像应该一样正常工作了。值得更深入地研究System.Xml命名空间。 - Todd Richardson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接