2014-09-04 30 views
1

我正在研究C#代码。我有我的XML文档与不同的节点,其中我需要计算具有相同的非文本值的节点的数量。我使用XmlDocument。假设我有一个xml文件,我必须计算具有InnerText值BSS的节点数。如何统计XML中具有相同内文值的节点数

代码:

<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.like这里的数应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

谢谢你Flynn – 2014-09-04 17:41:11

回答

3

如果你把它加载为XmlDocument,你可以做

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

虽然我认为可能有更有效的方式来编写XPath,但匹配所有内容然后检查其中的文本内容感觉可能效率不高。

如果这是一个完整的,有代表性的文档,那么你可以做

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

这将是更有效,因为它的靶向特定的元素,而不是整个文档。

如果搜索文本包含分隔列表管道(|)内,您可以使用此断言,而不是[.='BSS']

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

虽然这会慢一些。就个人而言,我建议无论您的源来自哪里,都会修改它以将此列表分隔为不同的元素,这将使查询数据变得更加容易。我强烈支持XML文档应遵循与数据库所做的“第一范式”规则相同的原则,并且不在任何一个文本节点/属性中包含多个值的原则。

+0

请让我知道是否有任何有效的方式通过匹配整个路径来编写代码。 – 2014-09-04 17:28:36

+0

谢谢弗林这为我工作。但是我需要知道如果我有一个不同的场景,其中单个节点中有两个或三个内部文本值,它们是管道或逗号分隔的。然后如何获得相同BSS值的计数。请参阅编辑的代码。 – 2014-09-10 11:13:24

1

我会使用新的Linq to XML API来代替:

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

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

感谢您的帮助!但是,如果有任何解决方案使用XmlDocument这将是一个很大的帮助。就像在我当前的项目中,我使用Xmldocument并且不能使用Linq到XML .... – 2014-09-04 17:25:35

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

这不太可能有所帮助,OP询问搜索内部文本与特定值匹配的节点,而不是标签名称。 – Flynn1179 2014-09-04 12:23:45

相关问题