c# - 直接读取根元素下的 XML 节点数的最有效方法

标签 c# xml performance stream

我需要计算 XML 流中根元素正下方的节点数。我不关心任何子节点。

例如,对于以下 XML,它应该返回 4:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <node1>
    <subnode1_1>
      <subnode_1_1_1>
        <subnode_1_1_1_1>…</subnode_1_1_1_1>
      </subnode_1_1_1>
      <subnode_1_1_2>…</subnode_1_1_2>
    </subnode1_1>
  </node1>
  <node2 />
  <node3>
    <subnode3_1>…</subnode3_1>
    <subnode3_2>…</subnode3_2>
    <subnode3_3>…</subnode3_3>
  </node3>
  <node4>…</node4>
</root>

在 C# 中执行此操作的最有效(我关心执行时间)方法是什么?假设我将 XML 正文作为 Stream

最佳答案

您可以使用 Linq To XML 在一行中将其删除:

var count = XDocument.Load(stream).Root.Elements.Count();
//count = 4

就效率而言,在给出的两个答案之间,我的结果是:

var sw = Stopwatch.StartNew();

XmlDocument xml = new XmlDocument();
xml.Load(stream);
int i = xml.LastChild.ChildNodes.Count; 

sw.Stop();
//971 ticks

var sw = Stopwatch.StartNew();
var count = XDocument.Load(stream).Root.Elements().Count();
sw.Stop();
//860 ticks

除非您进行多次迭代,否则实际上差异可以忽略不计

关于c# - 直接读取根元素下的 XML 节点数的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196692/

相关文章:

c# - 注销必须在 asp.net 中单击两次

c# - 部分观点的论证是错误的类型——这怎么可能?

xml - 通过多次变换替换和维护角色实体

mysql - 单个数据库查询中的多个 sql 更新

c# - 给定用户名和密码,您如何模拟提升的用户?

c# - 为什么在非托管错误中出现堆栈溢出异常

xml - If then else 在 XPath 1.0 中

xml - 删除 XML 文件中的节点?

c++ - std::map 与自写的基于 std::vector 的字典

c++ - QT。 Q标签性能