【发布时间】: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 压缩的。