【发布时间】:2013-11-14 13:58:29
【问题描述】:
我一直在使用 Linq to XML 和通过 foreach 循环解析 XML 解析器。
程序可以运行,但是速度很慢,因为我有 2 个根,里面有很多元素,这两个根的元素可以相关。 (文件不大,有1Mb到5Mb)。
所以,澄清一下,我在 .xml 文件中有 <Datas> 和 <Symbols> 根。 <Symbols> 中的元素通过每个<Symbol> 子<Type> 与<Datas> 元素相关联,如下所示:
<Datas>
<Data>
<Name>**SymbolType_1**</Name> // (As you can see, <Name> = <Type> of the <Symbol>)
<Type>DataType1</Type>
<Subitem>
<Name>SubitemName1</Name>
<Type>SubitemType1</Type>
</Subitem>
<Subitem>
<Name>SubitemName1</Name>
<Type>SubitemType1</Type>
</Subitem>
</Data>
<Data>
<Name>**SymbolType_2**</Name>
<Subitem>
<Name>SubitemName1</Name>
<Type>SubitemType1</Type>
</Subitem>
<Subitem>
<Name>SubitemName1</Name>
<Type>SubitemType1</Type>
</Subitem>
</Data>
[...]
</Datas>
<Symbols>
<Symbol>
<Name>SymbolName_1</Name>
<Type>**SymbolType_1**</Type>
</Symbol>
<Symbol>
<Name>SymbolName_1</Name>
<Type>**SymbolType_1**</Type>
</Symbol>
[...]
</Symbols>
因此,也有可能一些<Subitem> <Type> 连接到另一个<Data>,从而创建一个包含10 个元素的结构。
我现在要做的是使用foreach 循环获取每个<Symbol> 并应用方法来查看每个<Data> 及其各自的<Subitem> 子级。
由于我从 C# 开始,我想知道将所有 <Symbol>、<Data> 和 <Subitem> 存储在两个或三个不同的 <List> 中是否是个好主意,而不是解析列表的文件。
另外,将<Symbols> 拆分为“区域”并使用多个 foreach 循环同时负责解析每个区域是否明智(并且可能)?
最后我想知道是否可以存储每个<Data>的位置,所以我不需要从根<Datas>开始解析。
非常感谢。
【问题讨论】:
-
我不确定我是否完全理解您的用法。如果 XML 很小,我会尽快将其反序列化(例如使用
XmlSerializer)到对象模型中,并创建一些不错的字典查找,而不是使用 Linq-to-XML。编辑:我不知道 Linq-to-XML 是否有一些优化,但如果您经常重新查询数据或重新迭代 XML 树,这听起来可能会影响性能。跨度> -
您可以使用 xpath 导航到 xml 文档中的特殊节点。
-
解析 XML 最快的方法是使用 XmlTextReader msdn.microsoft.com/en-us/library/…
-
@ChrisSinclair linq-to-xml 将整个文件读入内存。一旦被解析,它就以
XNode对象图的形式存在。 -
哦,另外,如果您在谈论性能,您能详细介绍一下吗?例如,简单地反序列化 1 到 5 MB 的 XML 数据相当快。我的意思是,根据一些相对于其他操作的基准,它可能会 slow,但你想用它做什么?您是否尝试每秒阅读数百次?一次读入内存只需要很少的时间。