【问题标题】:How do I find duplicates in XML if an element contains value in C#?如果元素包含 C# 中的值,如何在 XML 中查找重复项?
【发布时间】:2019-05-22 09:53:24
【问题描述】:

我有一个 XML:

<root>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<p>This is a Value</p>
<h3>Another Value</h3>
<h3>Another Value</h3>
<h3>Another Value</h3>
<h3>Another Value</h3>
<h3>This is Another Value</h3>
</root>

我想查找重复值。所以,我这样做了:

var valueDuplicate = xdoc.Descendants().Where(n => n.Name.LocalName == "p" || n.Name.LocalName == "pw" ||
                                                       n.Name.LocalName == "plt" || n.Name.LocalName == "psf")
                             .GroupBy(x => x.Value).Where(g => g.Count() > 1)
                             .Select(g => new { ElementValue = g.Key, Count = g.Count() }).ToList();
string s = string.Join(Environment.NewLine, valueDuplicate.Select(t => "Value: " + t.ElementValue.Trim() + "- "
                                                                                        + t.Count + " times."));

这会找到重复值,但不会将 &lt;h3&gt;This is Another Value&lt;/h3&gt; 显示为重复值。我也想找到所有包含该值的元素。

【问题讨论】:

  • 使用g.Count() &gt;= 1 ?
  • 这会搜索文件中的几乎所有内容。我只想搜索 valueDuplicate 中的不同值。
  • 你需要 Group By 和包含吗?
  • @AmirNorouzpour - 是的。因此,所有元素 Equals()Contains() ValueAnother Value 都会显示出来。我的代码只处理Equals()
  • 你的输出必须是:Value: Value- 11 次。 ?

标签: c# .net xml linq


【解决方案1】:
XDocument xdoc = XDocument.Parse(xml);
var values = xdoc.Descendants().Select(x => x.Value);
var valueDuplicate = xdoc.Descendants().Select(r => new
 {
  el = r,
  value = values.FirstOrDefault(c => r.Value.Contains(c) || r.Value == c)
 }).GroupBy(x => x.value, x => x.el).Where(x => x.Count() > 1).ToList();

string s = string.Join(Environment.NewLine, valueDuplicate.Select(t => "Value: " + t.Key.Trim() + "- " + t.Count() + " times."));

【讨论】:

  • 这行得通:)。只是一个更新,由于某种原因,它还在valueDuplicate 变量中采用了空值。
【解决方案2】:
XDocument XDocument = XDocument.Parse(MyXmlFile);
        var grouped = XDocument.Descendants("P").GroupBy(x => x.Value).Where(g => g.Count() > 1);
        foreach (var groupItem in grouped)
        {
            foreach (var item in groupItem)
            {
                Console.WriteLine(item);
            }
        }

【讨论】:

  • 这似乎与我的输出相同。它不处理Contains(),只处理Equals()
  • var xml_Doc = XDocument.Load(Server.MapPath("xmlpath.xml")); IEnumerable search_date = null; search_date = (from xFi in xml_Doc.Descendants("List") where xFi.Element("tag").Value.Contains("value") select xFi);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多