2016-12-03 1 views
0

전체 파일을 추출하거나 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에서 이 아니고입니다. BZip2 스트림 위에 XmlTextReader를 열 수 있습니까? 아니면 이것을 할 다른 방법이 있습니까?

+0

파일은 zip 파일 (gz)이며 gz에는 단일 기사가 들어 있습니다. gz에 여러 개의 파일이 포함되어있는 경우 색인을 읽고 단일 파일을 추출 할 수 있습니다. gz에는 하나의 파일이 있기 때문에 XML 데이터를 파싱하기 전에 전체 파일을 다운로드하고 추출해야합니다. – jdweng

+1

"매우 큽니다"는 의미가 없습니다. 1Mb에서 1Tb까지의 모든 것을 의미 할 수 있습니다. 우리에게 전화 번호를 알려줄 수 없다면 크기에 대해 언급하지 마십시오. –

+0

@jdweng -이 덤프는 개별 파일의 타볼 (tarball)이 아닌 모든 위키피디아를 포함하는 매우 큰 단일 XML 파일입니다. – user655321

답변

0

이렇게하면됩니다. 나는 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); 
       } 
      } 

     } 
    } 
} 
+0

고마워요,하지만 여전히 압축 된 XML이 아닌 XML 입력 파일을 사용합니다. 압축을 풀 때 로컬 파일에서 기본적으로이 코드를 사용할 수 있지만 BZip2InputStream을 XmlReader로 래핑하면 여전히 같은 예외가 발생합니다. – user655321

+0

파일을 이전에 다운로드 할 때 파일을 Chrome으로 직접 읽을 수 없습니다. 파일을 디스크에 저장해야했습니다. 같은 오류가 발생하면 파일을 열기 전에 디스크에 파일을 ftp하면 궁금합니다. URL에서 전체 파일을 읽으려는 시도를하지 않았습니다. 동일한 오류가 발생하면 궁금합니다. – jdweng