加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – 获取innerXml XElement的最佳方式?

发布时间:2020-12-16 08:18:24 所属栏目:百科 来源:网络整理
导读:在下面的代码中获取混合body元素的内容的最好方法是什么?元素可能包含XHTML或文本,但我只想要其字符串形式的内容。 XmlElement类型有InnerXml属性,这正是我的后面。 代码写的几乎做了我想要的,但包括周围的 body … / body元素,我不想要。 XDocument do
在下面的代码中获取混合body元素的内容的最好方法是什么?元素可能包含XHTML或文本,但我只想要其字符串形式的内容。 XmlElement类型有InnerXml属性,这正是我的后面。

代码写的几乎做了我想要的,但包括周围的< body> …< / body>元素,我不想要。

XDocument doc = XDocument.Load(new StreamReader(s));
var templates = from t in doc.Descendants("template")
                where t.Attribute("name").Value == templateName
                select new
                {
                   Subject = t.Element("subject").Value,Body = t.Element("body").ToString()
                };
我想看看哪些建议的解决方案表现最好,所以我运行一些比较测试。出于兴趣,我还将LINQ方法与Greg建议的普通老System.Xml方法进行了比较。变化是有趣的,而不是我的预期,与最慢的方法比最快的速度慢3倍。

结果按最快到最慢排序:

> CreateReader – Instance Hunter(0.113秒)
> Plain old System.Xml – Greg Hurlman(0.134秒)
>聚合与字符串连接 – Mike Powell(0.324秒)
> StringBuilder – Vin(0.333秒)
> String.Join on array – Terry(0.360秒)
> String.Concat on array – Marcin Kosieradzki(0.364)

方法

我使用一个具有20个相同节点的单个XML文档(称为“提示”):

<hint>
  <strong>Thinking of using a fake address?</strong>
  <br />
  Please don't. If we can't verify your address we might just
  have to reject your application.
</hint>

以上秒数显示的数字是提取20个节点的“内部XML”,连续1000次,并取平均值(平均值)5次运行的结果。我没有包含将XML加载并解析为XmlDocument(对于System.Xml方法)或XDocument(对于所有其他)所花费的时间。

我使用的LINQ算法是:(C# – 所有采取一个XElement“父”,并返回内部XML字符串)

CreateReader:

var reader = parent.CreateReader();
reader.MoveToContent();

return reader.ReadInnerXml();

聚合与字符串连接:

return parent.Nodes().Aggregate("",(b,node) => b += node.ToString());

StringBuilder:

StringBuilder sb = new StringBuilder();

foreach(var node in parent.Nodes()) {
    sb.Append(node.ToString());
}

return sb.ToString();

String.Join on数组:

return String.Join("",parent.Nodes().Select(x => x.ToString()).ToArray());

数组上的String.Concat:

return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());

我没有在这里显示“Plain old System.Xml”算法,因为它只是在节点上调用.InnerXml。

结论

如果性能很重要(例如大量的XML,经常解析),我每次都使用Daniel的CreateReader方法。如果你只是做一些查询,你可能想使用迈克更简洁的聚合方法。

如果你在具有大量节点(也许是100年代)的大元素上使用XML,你可能会开始看到使用StringBuilder在Aggregate方法,而不是通过CreateReader的好处。我不认为Join和Concat方法会在这些条件下更高效,因为将大列表转换为大型数组(在这里使用较小的列表很明显)的代价。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读