2012-11-22 57 views
4

元素這是我的xml文件XPath來選擇與最後一個子價值

<profiles> 
<profile id='8404'> 
    <name>john</name> 
    <name>mark</name> 
</profile> 
<profile id='8405'> 
    <name>john</name> 
</profile> 
</profiles> 

,我想選擇其中最後一個「名」的孩子值=約翰,結果應該包含ID只= 8405的輪廓曲線 什麼可以評估這個xpath?

這裏是我的審判:

 var filterdFile = profilefileXML.XPathSelectElements("/profiles/profile[name[last()]='john']"); 

,但它沒有任何意義。

更新: 我的蹤跡是正確的,它只有一個語法錯誤。感謝所有

+0

你的xpath應該可以工作,即用'id = 8405'返回配置文件元素。如果你只想配置文件的id,那麼你需要添加'/ @ id',即'/ profiles/profile [name [last()] ='john']/@ id' – StuartLC

回答

3

可以將多個索引操作與連續[...]

var doc = XDocument.Parse(xml); //the xml from your question 

var node = doc.XPathSelectElement("/profiles/profile[name='john'][last()]"); 

Console.WriteLine(node.Attribute("id").Value); //outputs 8405 

這將返回一個包含與john一個值的元素name最後profile元素。

如果您在另一方面要返回所有元素這最後name元素具有john一個值,你的XPath應該已經工作:

var nodes = doc.XPathSelectElements("/profiles/profile[name[last()]='john']"); 
foreach (var node in nodes) 
{ 
    Console.WriteLine(node.Attribute("id").Value); 
} 
+0

這將返回最後一個配置文件包含'約翰' - 我認爲OP希望所有的配置文件與最後一個孩子'name ='john''。例如在列表末尾添加以下配置文件:' john bob' – StuartLC

+1

'我想我可能會誤解這個問題。更新了我的答案。感謝您指出我! –

0

您也可以嘗試LINQ

XDocument xDoc = XDocument.Load("data.xml"); 
var matches = xDoc.Descendants("profile") 
       .Where(profile => XElement.Parse(profile.LastNode.ToString()).Value == "john"); 

而且您可以使用foreach訪問xml數據

foreach(XElement xEle in lastEle) 
{ 
    var xAttribute = xEle.Attribute("id"); 
    if (xAttribute != null) 
    { 
     var id = xAttribute.Value; 
    } 
    var lastName = XElement.Parse(xEle.LastNode.ToString()).Value; 
} 
+0

專門詢問XPath的問題... –