如何使用XElement或XDocument查找具有重复属性值的节点?

时间:2018-04-09 15:40:20

标签: c# linq-to-xml

这是一个小样本xml

<parentNode>
    <c-node>
        <myNode axs="p1">Anything goes</myNode>
        <myNode axs="p2">Nothing <aa>is</aa> here</myNode>
        <myNode axs="p1">Whatever it may be</myNode>
        <myNode axs="p3">...</myNode>
    </c-node>
</parentNode>

如何找到具有重复属性值myNode的{​​{1}}并使用LINQ-to-XML获取行号?

因此,从上面的xml中,结果应该给出axs节点及其两个行号,即3&amp; 5结果。

1 个答案:

答案 0 :(得分:1)

您可以使用group by获取重复元素,然后您可以将XElement转换为IXmlLineInfo以获取行号(credits here):

var nodes = document.Descendants("myNode")
            .GroupBy(node => (string)node.Attribute("axs"))
            .Where(g => g.Count() > 1)
            .SelectMany(g => g.Select(node => new
            {
                Node = node,
                LineNumber = (node as IXmlLineInfo).LineNumber
            }))
            .ToList();

重要的是,您需要在按照建议here加载文档时传递LoadOptions.SetLineInfo,否则LineInfo将返回零:

var document = XDocument.Load(path, LoadOptions.SetLineInfo);