2011-02-03 9 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

私は、同時に要素をストリーミングして抽出するために読者のコンテンツを書き込む簡単な方法を知らない。 –