Я хотел бы разобрать .xml.bzip2 Викимедиа свалках без извлечения всего файла или выполнения каких-либо XML проверки:Чтение очень большие файлы .xml.bz2
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. Возможно ли открыть XmlTextReader поверх потока BZip2? Или есть другие способы сделать это?
Файлы zip-файлов (gz) и gz содержат одну статью. Если gz содержит несколько файлов, вы можете прочитать индекс и извлечь один файл. Поскольку gz содержит один файл, вам необходимо загрузить весь файл и извлечь его, прежде чем вы сможете анализировать данные xml. – jdweng
«Очень большой» не имеет смысла: он может означать что угодно: от 1 Мб до 1 Тб. Если вы не можете дать нам номер, не беспокойтесь упоминать размер. –
@jdweng - этот дамп - это один, очень большой XML-файл, содержащий всю Википедию, а не архив отдельных файлов. – user655321