繁体   English   中英

搜索子级时,XML返回父级节点

[英]XML Return parent node when searching children

我有以下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();

您可以使用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元素,这些元素至少具有一个带有内部Guid元素的Log子元素。 上面的代码返回:

<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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM