【问题标题】:C# and Reading Large XML FilesC# 和读取大型 XML 文件
【发布时间】:2019-08-08 23:15:11
【问题描述】:

我知道,我知道这已经被做死了;我只是发布一个问题,看看这个解决方案是否仍然相关,因为现在我们有 .NET 4 和更新版本

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

【问题讨论】:

  • 正如您在链接的站点中看到的那样,它提到了 LINQ to XML,我认为这是最简单和最快的方法之一(就编写代码而言)读取和写入 xml 文档。 Infact LINQ 是在 C# 3.0 中实现的,它是一种在集合和数据源上编写查询的强大方法。
  • @Fuex 使用开箱即用的 LINQ to XML 会将整个文档加载到内存中,因此虽然 编写 查询代码很容易,但它不会使性能有任何提升更快。但是,链接到的示例将XmlReader 与 LINQ 结合使用,因此应该可以很好地工作。
  • @James 是的,我同意你的看法。在处理大文件时将整个数据加载到内存中会成为一个问题,并且会影响查询的性能。所以将XmlReaderLINQ结合使用是个好主意。
  • 谢谢大家好信息,我会决定使用这种方法。非常感谢您的帮助。

标签: c# xml


【解决方案1】:

这个问题的答案在 .NET 4 中没有改变——为了获得最佳性能,您仍然应该使用XmlReader,因为它流式传输文档,而不是将整个内容加载到内存中。

您引用的代码使用XmlReader 进行实际查询,因此在大型文档上应该相当快。

【讨论】:

    【解决方案2】:

    如果看起来像这样:

    <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();
    

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

    【讨论】:

    • @GreenGood,不正确!我多次测试了这段代码,它工作正常。 'reader.ReadToDescendant("item");'寻找第一个元素,'reader.ReadOuterXml()' 读取当前元素,'reader.ReadToNextSibling("item")' 转到下一个元素。
    • 是否可以并行执行?
    • 此外,如果您的 xml 文件中没有空格,则在 ReadOuterXml 之后不应调用 ReadToNextSibling,因为它会跳过一项。所以你必须检查当前位置,如果是在音符开始,不要调用ReadToNextSibling
    【解决方案3】:

    最好的方法是使用XmlReader.Create逐行阅读。

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

    【讨论】:

    • XmlTextReader 不是已弃用吗?
    • 链接的文档在任何地方都没有说不推荐使用,所以我猜它不是......
    • @user1096188 感谢指出,我已更新代码以使用XmlReader.Create
    【解决方案4】:

    过去几天我一直在为同样的问题而苦苦挣扎。我只是右键单击 项目属性,然后导航到Build选项卡并选择选项Any CPU,勾选取消选中选项首选32位并在运行您的应用程序之前保存它,它对我有帮助。我附上了相同的快照。

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 2021-12-05
      • 2012-03-11
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多