【问题标题】:How to count the Number of Nodes with same innertext value in XML如何计算 XML 中具有相同内文值的节点数
【发布时间】:2014-09-04 12:00:05
【问题描述】:

我正在编写 C# 代码。我的 XML 文档具有不同的节点,其中我需要计算具有相同内部文本值的节点数。我正在使用 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>

在上面的代码中,我想计算具有内部文本值 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>

【问题讨论】:

    标签: c# asp.net xml


    【解决方案1】:

    如果你将它加载为XmlDocument,你可以这样做

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

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

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

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

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

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

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

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

    【讨论】:

    • 能否请您告诉我是否有任何通过匹配整个路径来编写代码的有效方法。
    • 感谢弗林这对我有用。但是,我需要知道我是否有不同的场景,即在单个节点中有 2 或 3 个内部文本值,该节点是管道或逗号分隔的。那么如何获得相同BSS值的计数。请查看修改后的代码。
    【解决方案2】:

    我会改用新的Linq to XML api:

    var xDocument = XDocument.Load("path");
    
    int count = xDocument.Descendants().Count(x => (string)x == "BSS");
    

    【讨论】:

    • 感谢您的帮助!!但是,如果有任何使用 XmlDocument 的解决方案,那将是一个很大的帮助。在我当前的项目中,我使用的是 Xmldocument,不能使用 Linq to XML....
    【解决方案3】:
    XmlDocument xmlD = new XmlDocument();
    xmlD.Load(Server.MapPath("sample.xml"));
    XmlNodeList xmlNL = xmlD.GetElementsByTagName("tagName");
    xmlNL.Count;
    

    【讨论】:

    • 这不太可能有帮助,OP 要求搜索内部文本与特定值匹配的节点,而不是标签名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多