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 

由于使用名为“id”的属性存在问题,我猜测这是返回 null,还是我在代码中遗漏了什么?

4

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

这将按预期返回一个非空节点。

更新

将 a 添加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命名空间?如果知道的人可以发表简短评论,我将不胜感激。

于 2009-04-30T23:10:10.310 回答