代码写的几乎做了我想要的,但包括周围的< 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() };
结果按最快到最慢排序:
> 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方法会在这些条件下更高效,因为将大列表转换为大型数组(在这里使用较小的列表很明显)的代价。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。