C# 选择SingleNode获取属性值
我试图使用selectsingle节点从匹配特定xpath查询的XML返回一个值 这是我正在使用的代码C# 选择SingleNode获取属性值,c#,xml,C#,Xml,我试图使用selectsingle节点从匹配特定xpath查询的XML返回一个值 这是我正在使用的代码 XmlDocument doc = new XmlDocument(); doc.Load(@"C:\Program Files\Config.xml"); string xPath; xPath = "/Configuration/Service[@name='InfoRepositoryClient']/Environment/Parameter[@na
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Program Files\Config.xml");
string xPath;
xPath = "/Configuration/Service[@name='InfoRepositoryClient']/Environment/Parameter[@name='ORBPreferredInterfaces']";
string value = doc.SelectSingleNode(xPath).Attributes["value"].Value;
Console.WriteLine("The value is {0}", value);
Console.WriteLine("XML Doc is ...");
XML示例
<Configuration version="7.2.0" xmlns="event_collection/WinCollect">
<Service version="7.2.0.799013" classification="Service" type="Service" module="WinCollectCommon" name="RegistryCache">
<Environment/>
</Service>
<Service version="7.2.0.799013" classification="Static" type="Service" module="AgentCore" name="AgentCore">
<Environment>
<Parameter value="300000" name="HeartbeatInterval"/>
<Parameter value="60000" name="ConfigurationCheckInterval"/>
<Parameter value="true" name="Enabled"/>
<Parameter value="false" name="Deleted"/>
</Environment>
</Service>
<Service version="7.2.0.799013" classification="Service" type="Service" module="WinCollectCommon" name="InfoRepositoryClient">
<Environment>
<Parameter value="0" name="DCPSDebugLevel"/>
<Parameter value="*=127.0.0*" name="ORBPreferredInterfaces"/>
<Parameter value="44380" name="DomainId"/>
<Parameter value="corbaloc::127.0.0.1:12345/DCPSInfoRepo" name="DCPSInfoRepo"/>
<Parameter value="1" name="DCPSBit"/>
</Environment>
</Service>
当我运行此命令时,我得到的对象引用没有设置为对象的实例。当我调试时,我看到我的值被设置为null
我只需要一个快速查询,使用XPath从XML中提取一个值
注意:当我在notepad++中运行xpath查询时,我得到以下结果
1次命中
参数
-@Value:*=127.0.0*
-@name:orbPreferredInterface
您的xml文件具有默认名称空间
xmlns=“event\u collection/WinCollect”
,因此您不能仅使用节点的本地名称来获取它们。我将使用Linq转换为Xml
var xdoc = XDocument.Load(@"C:\Program Files\Config.xml");
var ns = xdoc.Root.GetDefaultNamespace();
var parameter =
xdoc.Root.Elements(ns + "Service")
.Where(s => (string)s.Attribute("name") == "InfoRepositoryClient")
.Elements(ns + "Environment")
.Elements(ns + "Parameter")
.Where(p => (string)p.Attribute("name") == "ORBPreferredInterfaces")
.Select(p => (string)p.Attribute("value"))
.FirstOrDefault();
输出:
"*=127.0.0*"
使用XPath:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("ns", "event_collection/WinCollect");
var xpath = "ns:Service[@name='InfoRepositoryClient']/ns:Environment/ns:Parameter[@name='ORBPreferredInterfaces']";
var parameter = xdoc.Root.XPathSelectElement(xpath, nsmgr);
var value = (string)parameter.Attribute("value");
使用旧的XmlDocument API:
var doc = new XmlDocument();
doc.Load(@"C:\Program Files\Config.xml");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("ns", "event_collection/WinCollect");
var xpath = "ns:Service[@name='InfoRepositoryClient']/ns:Environment/ns:Parameter[@name='ORBPreferredInterfaces']";
var parameter = doc.DocumentElement.SelectSingleNode(xpath, nsmgr);
string value = parameter.Attributes["value"].Value;
您有一个默认的
xmlns
,即继承自根配置的xmlns=“event\u collection/WinCollect”
。您应该使用XmlNameSpaceManager
注册名称空间,然后将其传递给SelectSingleNode
调用:
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("e", "event_collection/WinCollect");
string value = doc.SelectSingleNode(xPath, nsm).Attributes["value"].Value;
您还需要限定xpath:
/e:Configuration/e:Service[@name='InfoRepositoryClient']
/e:Environment/e:Parameter[@name='ORBPreferredInterfaces']