尝试从XML检索节点时的空值

时间:2016-05-24 19:41:25

标签: c# .net xml xml-namespaces

我需要阅读并更新CollectionPlan的值 - > CheckpointOptions - > ThreadCheckpoints - >模式来自下面的xml

<?xml version="1.0" encoding="utf-8"?>
<CollectionPlan xmlns="urn:schemas-microsoft-com:visualstudio:tracelog">
  <StartupInfo>
    <LogFileName>
    </LogFileName>
    <LogFileDirectory>C:\LogFiles</LogFileDirectory>
    <MaximumLogFileSize>16384</MaximumLogFileSize>
  </StartupInfo>
  <CheckpointOptions>
    <ThreadCheckpoints>
      <Mode>FixedEventRate</Mode>
      <StartRate>30000</StartRate>
    </ThreadCheckpoints>
    <NotifyPointCheckpoints>
      <Mode>FixedEventRate</Mode>
      <StartRate>1000</StartRate>
    </NotifyPointCheckpoints>
  </CheckpointOptions>
  <!-- many other nodes -->
 </CollectionPlan>

为此,我有以下代码。

XmlDocument doc = new XmlDocument();
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("urn:", "schemas-microsoft-com:visualstudio:tracelog");
doc.Load(@"c:\myXml.xml");
var aNodes = doc.SelectSingleNode("CollectionPlan/CheckpointOptions/ThreadCheckpoints/Mode", manager);

然而,aNodes将变为NULL。我在这里有什么不正确的?

2 个答案:

答案 0 :(得分:2)

你有一些问题:

  1. 您需要使用XML中显示的正确的根命名空间。它是"urn:schemas-microsoft-com:visualstudio:tracelog"

  2. 在对AddNamespace的调用中,请勿在前缀字符串中使用::字符不是命名空间前缀的一部分,它用于在解析查询字符串时将前缀与元素本地名称分开。

  3. 在对SelectSingleNode的调用中,您需要在查询中使用您使用命名空间管理器定义的命名空间前缀"urn:"为节点本地名称添加前缀,因为您是XML节点搜索是在相应的命名空间中。

  4. 因此以下内容应该有效:

    XmlDocument doc = new XmlDocument();
    XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
    manager.AddNamespace("urn", "urn:schemas-microsoft-com:visualstudio:tracelog");
    doc.Load(@"c:\myXml.xml")
    var aNodes = doc.SelectSingleNode("urn:CollectionPlan/urn:CheckpointOptions/urn:ThreadCheckpoints/urn:Mode", manager);
    

    原型fiddle

答案 1 :(得分:1)

我认为您需要使用:

{{1}}

urn是协议,而不是前缀。它是命名空间规范的一部分,因此您需要将其放在那里。