【问题标题】:Why is SelectSingleNode returning null?为什么 SelectSingleNode 返回 null?
【发布时间】:2009-04-30 22:53:53
【问题描述】:

我正在处理一个 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?

【问题讨论】:

    标签: c# xml xmldocument xml-attribute selectsinglenode


    【解决方案1】:

    我无法使用 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" 添加到&lt;MT&gt; 元素后,我必须为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。
    • 您的更新似乎有意义。我试图建立一个 xml 的缩写形式,但忘记发布命名空​​间。感谢您抽出额外的时间来尝试解决这个问题。一旦我从原始 xml 中删除了命名空间,一切都会正常进行。绝对值得对 System.Xml 命名空间进行更多研究。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-26
    • 2016-12-28
    • 2015-11-25
    • 2015-07-04
    相关资源
    最近更新 更多