c# - 尝试从 XML 检索节点时为空值

标签 c# .net xml xml-namespaces

我需要从下面的 xml 读取和更新 CollectionPlan -> CheckpointOptions -> ThreadCheckpoints -> Mode 的值

<?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。我在这里有什么不正确的地方?

最佳答案

你有几个问题:

  1. 您需要使用出现在 XML 中的正确根命名空间。它是 “urn:schemas-microsoft-com:visualstudio:tracelog”

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

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

因此以下应该有效:

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

原型(prototype) fiddle .

关于c# - 尝试从 XML 检索节点时为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37422503/

相关文章:

c# - 使用 Visual Studio 测试运行程序运行的 xUnit 测试的输出未显示在“输出”窗口中

xml - 使用 '' #text'' 和 InnerText XML (Powershell) 之间的区别

c# - 为什么 ASCII.GetBytes 返回错误的字节

c# - 存储一个短字符串

c# - 如何在列表 <> 中查找重复项?

c# - 将表格显示为矩阵

c# - 为什么抽象类要实现抽象基类的抽象方法?

c# - 通过javascript在asp.net文本框控件中设置css类

c# - 为什么使用 dll 而不是类

xml - XSLT 中需要什么来添加缺失的 XML 元素?