【问题标题】:How to find node with duplicate attribute values using XElement or XDocument?如何使用 XElement 或 XDocument 查找具有重复属性值的节点?
【发布时间】:2018-04-09 15:40:20
【问题描述】:

这是一个小示例 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>

如何找到具有重复属性值axsmyNode 并使用LINQ-to-XML 获取行号?

所以从上面的 xml 中,结果应该给出 &lt;myNode axs="p1"&gt; 节点及其两个行号,即 3 和 5 作为结果。

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案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();
    

    重要的部分是你需要在加载文档时传递LoadOptions.SetLineInfo here 否则LineInfo 将返回零:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多