gpt4 book ai didi

.net - 获取 XElement 的 InnerXml 的最佳方法?

转载 作者:可可西里 更新时间:2023-11-01 12:09:55 25 4
gpt4 key购买 nike

获取混合内容的最佳方法是什么body下面代码中的元素?该元素可能包含 XHTML 或文本,但我只希望其内容为字符串形式。 XmlElement类型有 InnerXml这正是我所追求的属性(property)。

编写的代码几乎 可以满足我的要求,但包括周围的 <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 倍多

按最快到最慢排序的结果:

  1. CreateReader - 实例猎手(0.113 秒)
  2. 普通旧 System.Xml - Greg Hurlman(0.134 秒)
  3. 使用字符串连接进行聚合 - Mike Powell(0.324 秒)
  4. StringBuilder - Vin(0.333 秒)
  5. String.Join 数组 - Terry(0.360 秒)
  6. 数组上的 String.Concat - 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“parent”并返回内部 XML 字符串)

创建阅读器:

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

return reader.ReadInnerXml();

使用字符串连接聚合:

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

字符串生成器:

StringBuilder sb = new StringBuilder();

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

return sb.ToString();

String.Join 数组:

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 方法。如果您只是做一些查询,您可能想要使用 Mike 的更简洁的聚合方法。

如果您在具有大量节点(可能有 100 个)的大型元素上使用 XML,您可能会开始看到使用 StringBuilder 优于聚合方法的好处,但不会超过 创建阅读器。我不认为 JoinConcat 方法在这些情况下会更有效,因为将大列表转换为大数组的代价(在这里甚至很明显较小的列表)。

关于.net - 获取 XElement 的 InnerXml 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com