XmlTextReader 与 XDocument
我能够在.NET 中解析XML。现在我至少可以在 XmlTextReader
和 XDocument
之间进行选择。这两者(或框架中包含的任何其他 XML 解析器)之间是否有任何比较?
也许这可以帮助我做出决定,而无需深入尝试两者。
XML 文件预计会相当小,与易用性相比,速度和内存使用只是一个小问题。 :-)
(我将在 C# 和/或 IronPython 中使用它们。)
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您愿意将所有内容读入内存,请使用
XDocument
。它会让您的生活更加更加轻松。 LINQ to XML 是一个可爱的API。基本上,如果您需要以流方式处理巨大的 XML 文件,请使用
XmlReader
(例如XmlTextReader
)。这是一个更痛苦的 API,但它允许流式传输(即仅在需要时处理数据,因此您可以浏览一个巨大的文档,但一次只能在内存中保留少量数据)。然而,有一种混合方法 - 如果您有一个由小元素组成的巨大文档,您可以从位于元素开头的
XmlReader
创建一个XElement
,处理使用 LINQ to XML 编辑该元素,然后将XmlReader
移动到下一个元素并重新开始。If you're happy reading everything into memory, use
XDocument
. It'll make your life much easier. LINQ to XML is a lovely API.Use an
XmlReader
(such asXmlTextReader
) if you need to handle huge XML files in a streaming fashion, basically. It's a much more painful API, but it allows streaming (i.e. only dealing with data as you need it, so you can go through a huge document and only have a small amount in memory at a time).There's a hybrid approach, however - if you have a huge document made up of small elements, you can create an
XElement
from anXmlReader
positioned at the start of the element, deal with the element using LINQ to XML, then move theXmlReader
onto the next element and start again.XmlTextReader
已被弃用,请勿使用它。来自 XmlTeam 的 msdn 博客
有效的 Xml 第 1 部分:选择正确的 API
<块引用>
避免使用
XmlTextReader
。它包含相当多的错误,如果不破坏已经使用它的现有应用程序,就无法修复这些错误。世界已经进步,不是吗?您应该避免使用的 Xml API。
<块引用>
过时的 API 很容易出现,因为编译器可以帮助识别它们,但您还应该避免使用另外两个 API,即
XmlTextReader
和XmlTextWriter
。我们在这些类中发现了许多错误,我们无法在不破坏现有应用程序的情况下修复这些错误。最简单的方法是弃用这些类并要求人们使用替换 API。不幸的是,这两个类不能被标记为过时,因为它们是 ECMA-335(公共语言基础设施)标准的一部分(http://www.ecma-international.org/publications/standards/Ecma-335.htm) – 配套的 CLILibrary.xml 文件是分区 IV 的一部分)。好消息是,即使这些类没有被弃用,.NET Framework 中已经有这些类的替代 API,并且迁移到它们相对容易。首先,有必要找到使用
XmlTextReader
或XmlTextWriter
的位置(不幸的是,这是一个手动步骤)。现在,所有出现的XmlTextReader
都应替换为XmlReader
,所有出现的XmlTextWriter
应替换为XmlWriter
(请注意,XmlTextReader
派生自XmlReader
,XmlTextWriter
派生自XmlWriter
,因此应用程序已经可以使用这些例如作为形式参数)。最后一步是更改XmlReader
/XmlWriter
对象的实例化方式 - 不需要直接创建读取器/写入器,而是需要静态工厂方法。 Create()
存在于XmlReader
和XmlWriter
API 上。此外,Visual Studio 中的智能感知不会在 System.Xml 命名空间下列出
XmlTextReader
。该类定义为:XmlReader.Create
工厂方法根据传递的设置返回抽象类XmlReader
的其他内部实现。对于只进流 API(即不会将整个内容加载到内存中),请通过
XmlReader.Create
方法使用 XmlReader。要使用更简单的 API,请使用 XDocument 又名 LINQ To XML。在此处查找
XDocument
与XmlDocument
和此处。XmlTextReader
is kind of deprecated, do not use it.From msdn blogs by XmlTeam
Effective Xml Part 1: Choose the right API
The world has moved on, have you? Xml APIs you should avoid using.
Furthermore, intellisense in Visual Studio doesn't list
XmlTextReader
under System.Xml namespace. The class is defined as:The
XmlReader.Create
factory methods return other internal implementations of the abstract classXmlReader
depending on the settings passed.For forward-only streaming API (i.e. that doesn't load the entire thing into memory), use XmlReader via
XmlReader.Create
method.For an easier API to work with, go for XDocument aka LINQ To XML. Find
XDocument
vsXmlDocument
here and here.