在XML文档中,如下所示:
<root>
<fish value="Start"/>
<pointlessContainer>
<anotherNode value="Pick me!"/>
<anotherNode value="Pick me too!"/>
<fish value="End"/>
</pointlessContainer>
</root>
如何使用LINQ to XML的奇迹来查找fish
节点包含的完全的任何节点?请注意,在此示例中,我故意将fish
节点放在文档的不同级别,因为我预计这种情况会在野外发生。
显然,在这个例子中,我希望得到两个anotherNode
节点,而不是pointlessContainer
节点。
注意:两个“分隔”节点可能与文档中的其他非分隔节点具有相同的类型(例如fish
),但它们具有唯一属性,因此易于识别。
答案 0 :(得分:0)
对于您的样本,以下内容应该
XDocument doc = XDocument.Load(@"..\..\XMLFile2.xml");
XElement start = doc.Descendants("fish").First(f => f.Attribute("value").Value == "Start");
XElement end = doc.Descendants("fish").First(f => f.Attribute("value").Value == "End");
foreach (XElement el in
doc
.Descendants()
.Where(d =>
XNode.CompareDocumentOrder(d, end) == -1
&& XNode.CompareDocumentOrder(d, start) == 1
&& !end.Ancestors().Contains(d)))
{
Console.WriteLine(el);
}
但我没有测试或彻底思考它是否适用于其他情况。也许您可以检查一些样本数据并报告它是否有效。