我需要阅读并更新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。我在这里有什么不正确的?
答案 0 :(得分:2)
你有一些问题:
您需要使用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);
原型fiddle。
答案 1 :(得分:1)
我认为您需要使用:
{{1}}
urn是协议,而不是前缀。它是命名空间规范的一部分,因此您需要将其放在那里。