我需要从下面的 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。我在这里有什么不正确的地方?
最佳答案
你有几个问题:
您需要使用出现在 XML 中的正确根命名空间。它是
“urn:schemas-microsoft-com:visualstudio:tracelog”
。在调用
AddNamespace
时,不要在前缀字符串中使用:
。:
字符不是命名空间前缀的一部分,它用于在解析查询字符串时将前缀与元素本地名称分开。在调用
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/