我正在研究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>
答案 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;