【问题标题】:xpath to select elements with last child valuexpath 选择具有最后一个子值的元素
【发布时间】:2012-11-22 17:36:40
【问题描述】:

这是我的 xml 文件

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

我想选择最后一个“名称”子值 = john 的配置文件,结果应该只包含 id=8405 的配置文件 可以评估这个的 xpath 是什么?

这是我的试验:

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

但这没有意义。

更新: 我的线索是正确的,其中只有一个语法错误。谢谢大家

【问题讨论】:

  • 您的 xpath 应该可以工作,即返回带有 id=8405 的配置文件元素。如果只需要配置文件的 id,则需要添加/@id,即/profiles/profile[name[last()]='john']/@id

标签: c# xml xpath


【解决方案1】:

您可以通过连续的[...] 应用多个索引操作:

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

这将返回最后一个包含 name 元素的 profile 元素,其值为 john

另一方面,如果您想返回最后一个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' 的配置文件。例如在列表末尾添加以下配置文件&lt;profile id='8406'&gt; &lt;name&gt;john&lt;/name&gt; &lt;name&gt;bob&lt;/name&gt;
  • 我想我可能误解了这个问题。更新了我的答案。感谢您向我指出!
【解决方案2】:

你也可以试试 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2023-04-03
    相关资源
    最近更新 更多