【问题标题】:Reading very large .xml.bz2 files读取非常大的 .xml.bz2 文件
【发布时间】:2016-12-03 03:52:08
【问题描述】:

我想在不提取整个文件或执行任何 XML 验证的情况下解析 Wikimedia 的 .xml.bzip2 转储:

var filename = "enwiki-20160820-pages-articles.xml.bz2";

var settings = new XmlReaderSettings()
{
    ValidationType = ValidationType.None,
    ConformanceLevel = ConformanceLevel.Auto // Fragment ?
};

using (var stream = File.Open(filename, FileMode.Open))
using (var bz2 = new BZip2InputStream(stream))
using (var xml = XmlTextReader.Create(bz2, settings))
{
    xml.ReadToFollowing("page");
    // ...
}

BZip2InputStream 有效 - 如果我使用 StreamReader,我可以逐行读取 XML。但是当我使用XmlTextReader 时,当我尝试执行读取时它会失败:

System.Xml.XmlException: '文件意外结束。以下元素未关闭:mediawiki。第 58 行,位置 1。'

bzip 流在 EOF 时不是。是否可以在 BZip2 流上打开 XmlTextReader?还是有其他方法可以做到这一点?

【问题讨论】:

  • 文件为 zip 文件 (gz),gz 包含一篇文章。如果 gz 包含多个文件,那么您可以读取索引并提取单个文件。由于 gz 包含单个文件,因此您必须先下载整个文件并解压缩,然后才能解析 xml 数据。
  • “非常大”是没有意义的:它可以表示从 1Mb 到 1Tb 的任何值。如果你不能给我们一个数字,那就别提尺寸了。
  • @jdweng - 这个转储是一个非常大的 XML 文件,包含所有维基百科 - 不是单个文件的压缩包。
  • 我在网站上没有看到任何 xml 格式的转储文件。所有转储都是其他格式。这些文件可能包含xml格式,但文件的扩展名不同,这表明不能使用XmlTextRead。
  • @MichaelKay 如前所述,该文件是英语维基百科的.xml.bz2 转储。很明显,它至少在千兆字节范围内。不过,准确地说,它是 12.3GB 压缩的。

标签: c# xml


【解决方案1】:

这应该可行。我使用了 XmlReader 和 Xml Linq 的组合。您可以根据需要解析 XElement 文档。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication29
{
    class Program
    {
        const string URL = @"https://dumps.wikimedia.org/enwiki/20160820/enwiki-20160820-abstract26.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(URL);

            while (!reader.EOF)
            {
                if (reader.Name != "doc")
                {
                    reader.ReadToFollowing("doc");
                }
                if (!reader.EOF)
                {
                    XElement doc = (XElement)XElement.ReadFrom(reader);
                }
            }

        }
    }
}

【讨论】:

  • 谢谢,虽然这仍然使用 XML 输入文件,而不是压缩的 XML。解压缩时,我基本上可以在本地文件上使用此代码,但是用 XmlReader 包装 BZip2InputStream 仍然会引发相同的异常。
  • 当我早先下载文件时,我无法将文件直接读入 chrome。我不得不将文件保存到磁盘。如果您遇到相同的错误,我想知道您是否在打开之前将文件 ftp 到磁盘。我没有尝试我的代码从 URL 读取整个文件。想知道是否发生同样的错误。
猜你喜欢
  • 2015-09-17
  • 2019-04-30
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多