2012-10-17 86 views
6

我知道,我知道这已经做死;我只是张贴一个问题,看看这个解决方案是否仍然相关,因为现在我们有.NET 4和更新C#和读取大型XML文件

This link解释一个简单的方法来读取大型XML文件,它实现Linq。我非常喜欢这个,只是想要一个简单的答案/ s来说明这是否仍然相关,或者是否有更好的.NET代码更好的实现。

+0

正如您在链接的站点中看到的那样,它提到了* LINQ to XML *,我认为它是读写xml文档最简单快捷的方法之一(就编写代码而言)。 Infact LINQ是在* C#3.0 *中实现的,它是一种对集合和数据源编写查询的强大方法。 –

+2

@Fuex使用LINQ to XML即可将全部文档加载到内存中,因此虽然很容易*写*查询代码,但它不会使性能更快。但是,链接到的示例使用'XmlReader'与LINQ结合使用,因此应该工作得很好。 – James

+0

@詹姆斯是的,我同意你的看法。将整个数据加载到内存中会成为处理大文件时的问题,并会影响查询的性能。因此,将'XmlReader'与* LINQ *结合使用是个不错的主意。 –

回答

5

回答这个问题在.NET 4中并没有改变 - 为了获得最佳性能,你仍然应该使用XmlReader因为它文件而不是加载完整的东西到内存中。

您参考使用代码XmlReader的实际查询所以应该对大文件相当快。

1

要做到这一点,最好的办法是通过使用XmlReader.Create逐行阅读。

var reader = XmlReader.Create(filename); 
reader.WhitespaceHandling = WhitespaceHandling.None; 
while (reader.Read()) 
{ 
    // your code here. 
} 
+2

是不是不赞成使用XmlTextReader? – user1096188

+1

链接的文档没有关于它的任何地方过时,所以我猜它不是... – Chris

+0

@ user1096188感谢指出的那样,我已经更新使用'XmlReader.Create'的代码。 – Ekk

4

如果它看起来像这样:

<root> 
    <item>...</item> 
    <item>...</item> 
    ... 
</root> 

你可以用XmlReader阅读文件和每个 '项目' 与XmlDocument像这样打开:

reader.ReadToDescendant("root"); 
reader.ReadToDescendant("item"); 

do 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(reader.ReadOuterXml()); 
    XmlNode item = doc.DocumentElement; 

    // do your work with `item` 
} 
while (reader.ReadToNextSibling("item")); 

reader.Close(); 

在这种情况下,你有文件大小没有限制。

+0

非常好的建议! – Haukman

+0

此代码是错误的。它读取第一个项目,然后第三个等 – GreenGood

+0

@GreenGood,不正确!我测试了这段代码很多次,它正常工作。 'reader.ReadToDescendant( “项目”);'寻找第一个元素,'reader.ReadOuterXml()'读取当前元素,'reader.ReadToNextSibling(“item”)'进入下一个元素。 –

0

我是从过去的几天同样的问题挣扎。我只是右击项目属性然后导航到Build标签和选择选项任何CPU,剔取消选中选项身高32位,并将其保存之前运行你的应用程序,它帮助我。我附上了相同的快照。 enter image description here