如何计算xml文件中相同innerText的数量?

时间:2014-05-13 09:44:28

标签: c# xml

我尝试计算,然后显示xml文件中有多少innerText是相同的。我发现这段代码可以计算存在多少个相等的节点,但不会计算多少等于innerText

var doc = new XmlDocument();
doc.Load(path_to_xml);
var result = from XmlNode n in doc.SelectNodes("//task/*")
             group n by n.InnerText into g
             select new {
                 Text = g.Key,
                 Count = g.Count()
             };

例如,我有一个像这样的xml:

<rootNode>
    <foo>
        <first>stackoverflow</first>
        <second>stackoverflow</second>
        <third>superuser</third>
    </foo>
</rootNode>

现在我应该得到那个结果:

stackoverflow: Count 2
superuser: Count 1

有办法吗?我正在使用XmlDocument解析XML。

有什么建议吗? :)

2 个答案:

答案 0 :(得分:3)

可能是这个吗?

使用Linq to Xml:

var result = XDocument.Parse(xml)
    .Descendants("foo")
    .Elements()
    .GroupBy(x => x.Value)
    .ToDictionary(x => x.Key, y => y.Count());

使用XmlDocument:

var doc = new XmlDocument();
doc.LoadXml(xml);

var node = doc.SelectSingleNode("//foo");
var result2 = node.ChildNodes
    .Cast<XmlNode>()
    .GroupBy(x=>x.InnerText)
    .ToDictionary(x => x.Key, y => y.Count());

要在Messagebox中显示,请尝试以下操作:

foreach (var pair in result)
{
    MessageBox.Show(string.Format("{0} found {1} number of times", pair.Key, pair.Value));
}

答案 1 :(得分:0)

对于您粘贴的XML,它将是这样的:

var result = from XmlNode n in doc.SelectNodes("/rootNode/foo/*")
             group n by n.InnerText into g
             select new {
                 Text = g.Key,
                 Count = g.Count()
             };

确保您的XPath正确...

将结果转储到控制台可能是这样的:

result.ToList().ForEach(r => Console.WriteLine( r.Text + ": Count " + r.Count));