我正在编写解析XML的代码。
我想知道什么是更快解析:元素或属性。
这将对我的XML设计产生直接影响。
请定位C#的答案以及LINQ和XmlReader之间的差异。
感谢。
答案 0 :(得分:4)
设计XML架构,以便信息的表示实际上有意义。通常,在属性或元素中创建内容之间的决定不会影响性能。
XML的性能问题在大多数情况下与大量数据相关,这些数据以非常详细的XML方言表示。典型的对策是在通过线路存储或传输XML数据时压缩XML数据。
如果这还不够,那么可能需要切换到另一种格式,如JSON,ASN.1或自定义二进制格式。
解决问题的第二部分:XDocument
(LINQ)和XmlReader
类之间的主要区别在于XDocument
类构建完整的文档对象模型(DOM)在内存中,这可能是一项昂贵的操作,而XmlReader
类在输入文档中为您提供了一个标记化的流。
答案 1 :(得分:3)
使用XML,速度取决于很多因素。
关于属性或元素,选择一个更接近数据的元素。作为指导,我们使用对象的属性,以及对象的属性;和包含的子对象的元素。
根据您使用属性所讨论的数据量,可以节省一些xml流的大小。例如,<person id="123" />
小于<person><id>123</id></person>
这不会影响解析,但会影响通过网络线传输数据或从磁盘加载数据的速度......如果我们正在谈论大约数千条此类记录可能会对您的申请产生影响。
当然,如果这确实有所作为,那么使用JSON或某些二进制表示可能是更好的方法。
您需要问的第一个问题是甚至是否需要XML。如果它不需要是人类可读的,则二进制可能更好。哎呀,CSV甚至是固定宽度的文件可能会更好。
关于LINQ vs XmlReader,这将归结为您在解析数据时对数据执行的操作。您是否需要实例化一堆对象并以这种方式处理它们,或者您只是需要在流入时读取流?您甚至可能会发现只对数据进行基本的字符串操作可能是最简单/最好的方法。
重点是,您可能需要检查每种方法的优势,而不仅仅是“更快地解析”。
答案 2 :(得分:1)
没有任何硬数据证明这一点,我知道微软的WCF团队选择将DataContractSerializer作为WCF的标准。它的局限性在于它不支持XML属性,但确实比XmlSerializer快10-15%。
根据这些信息,我认为使用XML属性的解析速度比仅使用XML元素要慢。