2012-02-27 111 views
10

我正在尝试创建从XML文档抓取特定元素的XPath查询/字符串。我试图抓住id = 38的元素,但是由于某种原因,我的代码总是返回任何内容。XPath字符串,抓取具有特定id值的元素

如果你看我的代码&我的XML文件的组织可以告诉我什么XPath我需要抓住ID = 38的元素?

我的代码是:

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(getProductURL()); 
XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38')"); 

// node always is null for some reason? 

的XML的组织方式是像这样:

<courseg> 
    <group isempty="False" isbranch="true" id="1" name="abc"> 
     <group isempty="False" isbranch="true" id="38" name="def"></group> 
    </group> 
</courseg> 

回答

19

你需要的是

//*[@id='38'] 

下面是该示例中的XPath XDocument:

 XDocument xdoc = XDocument.Parse(@" 
<courseg> 
    <group isempty=""False"" isbranch=""true"" id=""1"" name=""abc""> 
     <group isempty=""False"" isbranch=""true"" id=""38"" name=""def""></group> 
    </group> 
</courseg>"); 
     XElement node = xdoc.Root.XPathSelectElement("//*[@id='38']"); 
     Console.WriteLine(node); 
3

使用此XPath查询:

//*[@id = 38] 

它选择的每一个节点与id属性等于38。如果你有更具体,即选择groupid属性等于38,用这一个:

//group[@id = 38] 
-1

当你提到

xdoc.DocumentElement.SelectSingleNode("id('38')" 

你问的XmlDocument搜索一个子节点内名为'id'的根节点。但理想的'id'是一个属性而不是xmlnode。

所以,你必须使用//group[@id = '38']让所有有孩子的节点名称“组”和属性“ID”与38

+0

错了。这不是id()函数的作用。 – 2012-02-27 08:58:03

5

功能ID(“P38”)的值将与一个ID值来选择元素的P38。但这并不仅仅意味着“一个名为'id'的属性”。它意味着在DTD或模式中声明的属性为类型ID。你没有显示DTD或模式,我怀疑你没有。如果你这样做了,并且如果它声明id属性是类型ID的话,那么你的文档将是无效的,因为ID值不能是全数字(对于传统的SGML原因,它必须采用名称的形式)。

实际上,除非您有严格的性能要求,否则最好避免使用id()函数。它太脆弱了 - 只有在您针对模式或DTD验证源文档时才有效。在XSLT中,改用key()。或者,许多处理器现在可以将属性名称xml:id识别为“自我声明”ID值,而不参考模式或DTD:如果您的处理器支持它,则使用该值。

相关问题