XPath选择具有最后子元素值的元素

4
这是我的XML文件。
<profiles>
 <profile id='8404'>
  <name>john</name>
  <name>mark</name>
 </profile>
 <profile id='8405'>
  <name>john</name>
 </profile>
</profiles>

我希望筛选出最后一个“name”子值为John的个人资料,结果应该只包含id=8405的个人资料。您能给出相应的XPath表达式吗?

以下是我的尝试:


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

但是这没有意义。

更新: 我的尝试是正确的,只是其中有语法错误。谢谢大家。


你的xpath应该是有效的,即返回具有id=8405的个人资料元素。如果你只想要个人资料的id,则需要添加/@id,即/profiles/profile[name[last()]='john']/@id - StuartLC
2个回答

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

这将返回最后一个包含值为johnname元素的profile元素。
另一方面,如果您想要返回所有最后一个name元素具有值john的元素,则您的XPath应该已经起作用:
var nodes = doc.XPathSelectElements("/profiles/profile[name[last()]='john']");
foreach (var node in nodes)
{
    Console.WriteLine(node.Attribute("id").Value);
}

这将返回包含“john”的最后一个配置文件 - 我认为OP想要所有具有最后一个子项name ='john'的配置文件。例如,在列表末尾添加以下配置文件<profile id ='8406'> <name> john </name> <name> bob </name> - StuartLC
1
我觉得我可能误解了这个问题。已更新我的回答。感谢你指出给我! - Anders Arpi

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接