簡體   English   中英

在XMLReader.Read()期間壓縮XML

[英]Compress XML during XMLReader.Read()

我有一種方法,該方法使用XMLReader (同時進行驗證)循環提取一個特定的信息,從而遍歷XML文檔。 我還需要壓縮整個XML文檔,以准備將其存儲在數據庫中。 我要做的代碼如下。 (將整個XmlReader傳遞給StreamWriter.Write()是實現此目標的適當/最有效的方法嗎? 我沒有找到一種清晰的方法來使用while(validatingReader.Read())循環來達到相同的結果。

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

        }
    }
}

壓縮部分看起來不錯。 對於大型文檔,MemoryStream可能不是最佳選擇,但是在更改之前,請檢查性能是否適合您的方案。

“提取特定元素”部分將不會讀取任何內容,因為閱讀器僅處於轉發狀態,因此在執行該部分時已讀取所有內容。 您可能需要重新創建閱讀器。

備查:

問題中的代碼無法正常工作。 XmlReader傳遞給StreamWriter不能正常工作。 最后,我並沒有最終以這種方式將壓縮與驗證相結合,因此我沒有確切的“正確”代碼來顯示此信息,但不想懸而未決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM