1

我有以下 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 to xml 但似乎无法正确使用,有人可以帮忙吗?

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

1 回答 1

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();
于 2013-06-03T14:44:52.147 回答