首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SelectSingleNode获取属性值

SelectSingleNode获取属性值
EN

Stack Overflow用户
提问于 2014-06-17 16:31:04
回答 2查看 6.8K关注 0票数 0

我试图使用select单个节点返回与特定xpath查询匹配的XML值。

这是我使用的代码,

代码语言:javascript
复制
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样本,

代码语言:javascript
复制
<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>

当我运行它时,我会得到对象引用,而不是设置为对象的实例。当我调试时,我看到我的值被设置为空。

我只需要一个快速查询,就可以使用XPath从XML中提取一个值。

注意:当我在记事本++中运行xpath查询时,会得到以下结果

1 hit Parameter - @Value: *=127.0.0* - @name: ORBPreferredInterfaces

EN

回答 2

Stack Overflow用户

发布于 2014-06-17 16:36:47

您的xml文件具有默认的命名空间xmlns="event_collection/WinCollect",因此您不能只使用节点的本地名称来获取它们。我会和Linq一起去Xml

代码语言:javascript
复制
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();

输出:

代码语言:javascript
复制
"*=127.0.0*"

使用XPath:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2014-06-17 16:37:42

游戏中有一个默认的xmlns,即从根Configuration继承的xmlns="event_collection/WinCollect"。您应该使用XmlNameSpaceManager注册名称空间,然后将其传递给您的SelectSingleNode调用:

代码语言:javascript
复制
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("e", "event_collection/WinCollect");
string value = doc.SelectSingleNode(xPath, nsm).Attributes["value"].Value;

您还需要限定xpath:

代码语言:javascript
复制
/e:Configuration/e:Service[@name='InfoRepositoryClient']
/e:Environment/e:Parameter[@name='ORBPreferredInterfaces']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24268992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档