2009-04-30 169 views
5

我与包含类似于这样结构的XML文档的工作:为什么SelectSingleNode返回null?

<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 

不过我遇到一个问题,只有这一个特定的文件,当我尝试运行的下一行代码:

我是在钻井平台通过猜测,这是因为使用名为'id'的属性问题返回null,或者我缺少代码中的东西吗?

回答

9

我不能使用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 的命名空间?如果有人知道可以发表评论,我将不胜感激。

+0

回答我自己的问题。 XmlNameTable用于优化字符串比较,我猜你可以给XmlNamespaceManager一个现有名称表的原因允许与XmlDocument元素进行快速比较,因为这些元素会共享NameTable。 – 2009-04-30 23:34:00