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