2011-02-03 2 views
1

특정 정보를 추출하여 XMLReader (동시에 유효성 검사)을 사용하여 XML 문서를 반복하는 방법이 있습니다. 또한 을 전체 XML 문서를 데이터베이스에 저장하기위한 준비로 압축해야합니다. 이 작업을 수행해야하는 코드는 다음과 같습니다. (전체 XmlReaderStreamWriter.Write()으로 전달) 이것을 달성하는 가장 효과적인 방법은 무엇입니까? 동일한 결과를 얻기 위해 while(validatingReader.Read()) 루프를 사용하는 명확한 방법을 찾지 못했습니다.XMLReader.Read() 중 XML 압축

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
schemaSet.Add("schemaNamespace", "schemaLocation"); 

XmlReaderSettings readerSettings = new XmlReaderSettings(); 
readerSettings.ValidationType = ValidationType.Schema; 
readerSettings.Schemas.Add(schemaSet); 
readerSettings.ValidationEventHandler 
       += new ValidationEventHandler(XMLValidationError); 

using (XmlReader documentReader = requestXML.CreateNavigator().ReadSubtree()) 
{ 
    using (XmlReader validatingReader = 
      XmlReader.Create(documentReader, readerSettings)) 
    { 
     using (MemoryStream output = new MemoryStream()) 
     { 
      using (DeflateStream gzip = 
        new DeflateStream(output, CompressionMode.Compress)) 
      { 
       using (StreamWriter writer = 
         new StreamWriter(gzip, System.Text.Encoding.UTF8)) 
       { 
        writer.Write(validatingReader); 
        this.compressedXMLRequest 
            = Encoding.UTF8.GetString(output.ToArray()); 
       } 
      } 
     } 
     while (validatingReader.Read()) 
     { 
      // extract specific element contents 

     } 
    } 
} 

답변

0

:

질문의 코드가 제대로 작동하지 않습니다. XmlReaderStreamWriter으로 전달하면 예상대로 작동하지 않습니다. 결국 나는 이런 방식으로 압축과 압축을 결합하지 않았으므로 정확하게 표시 할 "올바른"코드가 없지만 질문을 매달 리지 않으려 고하지 않았습니다.

0

압축 부분이 잘 보입니다. MemoryStream은 대용량 문서의 최선의 선택이 아니지만 변경하기 전에 시나리오의 성능이 괜찮은지 확인하십시오.

"추출 특정 요소"부분은 판독기가 앞으로 만 이동하므로 아무 내용도 읽지 않으므로 모든 내용은 해당 부분이 실행될 때까지 이미 읽혀 있습니다. 독자를 다시 만들고 싶을 수도 있습니다. 나중에 참조 할 수 있도록

+0

압축 결과는 5Mb 미만입니다. 나는 이것이 MemoryStream에 대해 받아 들일 만하다고 생각 하는가? 특정 XML 요소 컨텐츠를 추출 할 수있는 동안 독자 컨텐츠를 다른 스트림에 작성할 수있는 방법이 있습니까? –

+1

MemoryStream은 임의의 크기를 처리 할 수 ​​있습니다. 문제가 충분히 빠르면 문제가됩니다. 문제는 MemoryStream이 커지면서 이전에 새로 할당 된 배열에 내용을 복사해야한다는 것입니다. 빠르지 않을 수도 있습니다. 이렇게하면 많은 시간 (~ 1MB +)의 스트림에서 측정 할 수 있습니다. –

+0

나는 동시에 엘리먼트를 스트리밍하고 추출하기 위해 독자의 컨텐트를 작성하는 쉬운 방법을 모른다. –

관련 문제