XML在搜索子项时返回父节点

时间:2013-06-03 14:28:17

标签: xml linq linq-to-xml

我有以下XML

<Log>
<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00085</Guid>
    </Log>
</Log>
<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00086</Guid>
    </Log>
</Log>
<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00087</Guid>
    </Log>
</Log>
</Log>

我想在搜索Guid时返回第二个元素Log及以下,例如

<Log>
    <Log>
    </Log>
    <Log>
        <Guid>16fea409-58cc-e211-9b7f-005056b00085</Guid>
    </Log>
</Log>

我已经尝试过使用linq到xml的所有种类,但似乎无法正确使用,有人可以帮忙吗?

    XElement Log = XElement.Parse(responseXml)
    .Elements("Log")
    .Where(x => x.Element("Guid").Value == "16fea409-58cc-e211-9b7f-005056b00085")
    .FirstOrDefault();

1 个答案:

答案 0 :(得分:1)

您可以使用Linq和XPath(添加对System.Xml.XPath命名空间的引用)来执行此操作:

var guid = "16fea409-58cc-e211-9b7f-005056b00086";
var log = xdoc.XPathSelectElements("//Log[Log/Guid]")
              .Where(g => (string)g.XPathSelectElement("Log/Guid") == guid)
              .FirstOrDefault();

表达式//Log[Log/Guid]选择所有Log个元素,这些元素至少有一个Log子元素具有内部Guid元素。上面的代码返回:

<Log>
  <Log></Log>
  <Log>
    <Guid>16fea409-58cc-e211-9b7f-005056b00086</Guid>
  </Log>
</Log>

或者简单的Linq。您可以使用Parent属性。但在这种情况下,您需要确保所有Guid元素仅嵌套在至少两个Log元素中

var guid = "16fea409-58cc-e211-9b7f-005056b00086";
var log = xdoc.Descendants("Guid")
              .Where(g => (string) g == guid)
              .Select(g => g.Parent.Parent)
              .FirstOrDefault();