我尝试计算,然后显示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。
有什么建议吗? :)
答案 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));