如何计算XML中具有相同innertext值的节点数

时间:2014-09-04 12:00:05

标签: c# asp.net xml

我正在研究C#代码。我的XML文档包含不同的节点,其中我需要计算具有相同innertext值的节点数。我正在使用XmlDocument。假设我有一个xml文件,我必须计算具有InnerText值BSS的节点数。

代码:

<Annotations>
 <Objects>
  <ObjectId>BSS</ObjectId>
  <ObjectId>CAT</ObjectId>
 </Objects>
<Objects>
  <ObjectId>BSS</ObjectId>
  <ObjectId>ABC</ObjectId>
 </Objects>
<Objects>
  <ObjectId>BSS</ObjectId>
  <ObjectId>PCT</ObjectId>
 </Objects>
</Annotations>

在上面的代码中,我想要计算具有innertext值BSS的节点数量。这里的计数应该是3.您的帮助将不胜感激。

编辑代码:

<Annotations>
 <Objects>
  <ObjectId>BSS|SAF|PAT</ObjectId>
  <ObjectId>CAT</ObjectId>
 </Objects>
<Objects>
  <ObjectId>BSS|SAF|PAT</ObjectId>
  <ObjectId>ABC</ObjectId>
 </Objects>
<Objects>
  <ObjectId>BSS|SAF|PAT</ObjectId>
  <ObjectId>PCT</ObjectId>
 </Objects>
</Annotations>

3 个答案:

答案 0 :(得分:3)

如果您将其作为XmlDocument加载,则可以执行

doc.selectNodes("//*[.='BSS']").Count;

虽然我认为可能有一种更有效的方法来编写XPath,但是匹配所有内容然后检查它的文本内容感觉它可能效率低下。

如果这是一份完整且具有代表性的文件,那么您可以

doc.selectNodes("Annotations/Objects/ObjectId[.='BSS']").Count;

这会更有效率,因为它针对特定元素而不是整个文档。

如果搜索文本包含在管道(|)分隔列表中,则可以使用此谓词而不是[.='BSS']

[contains(concat('|',.,'|'),'|BSS|')]

虽然这会慢一点。就个人而言,我建议您在源代码来源的地方进行修改,将此列表分成单独的元素,这样可以更轻松地查询数据。我强烈主张XML文档应遵循与“第一范式”相同的原则。数据库执行的规则,并且不包括任何一个文本节点/属性中的多个值。

答案 1 :(得分:1)

我会使用新的Linq to XML api:

var xDocument = XDocument.Load("path");

int count = xDocument.Descendants().Count(x => (string)x == "BSS");

答案 2 :(得分:0)

XmlDocument xmlD = new XmlDocument();
xmlD.Load(Server.MapPath("sample.xml"));
XmlNodeList xmlNL = xmlD.GetElementsByTagName("tagName");
xmlNL.Count;