2012-02-27 99 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:如果您的處理器支持它,則使用該值。

相關問題