c# - 为什么 SelectSingleNode 返回 null?

标签 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 还是我在代码中遗漏了某些内容,我是否走在了正确的轨道上?

最佳答案

我无法使用 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 配置 namespace 管理器并为事件使用 namespace 。由于某种原因无法使默认命名空间工作。

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);

在尝试让它工作时,有一件事让我感到困惑。如果不是为了找出它包含的 namespace ,为什么 XmlNamespaceManager 需要文档中的 XmlNameTable?比如,为什么我需要定义 NameTable 命名空间?如果知道的人可以发表简短评论,我将不胜感激。

关于c# - 为什么 SelectSingleNode 返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809496/

相关文章:

.net - 修复错误的 XML 文件(例如未转义等)

java - 为什么我的应用程序因 NullPointerException 崩溃

Android 使用布局作为模板创建多个布局实例

c# - 将 XmlDocument 对象转换为 XmlNode 对象 - C#?

c# - 为什么 SourceUpdated 事件不触发我在 WPF 中的图像控件?

c# - 如何在 Windows Universal App 中获取应用程序版本?

c# - XmlDocument 忽略 xmlns

c# - DocumentElement.AppendChild 抛出未设置到对象实例的对象引用

c# - 类对象数组的构造函数

c# - C# 上 64 位架构上的 SetupDiEnumDeviceInterfaces