在XMLReader.Read()期间压缩XML

时间:2011-02-03 16:57:32

标签: c# xml compression xmlreader

我有一个方法,它使用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

        }
    }
}

2 个答案:

答案 0 :(得分:0)

压缩部分看起来很好。 MemoryStream可能不是大型文档的最佳选择,但在更改之前检查您的方案的性能是否正常。

“提取特定元素”部分不会读取任何内容,因为读者只能转发,因此在执行该部分时已经读取了所有内容。您可能想要重新创建阅读器。

答案 1 :(得分:0)

供将来参考:

问题中的代码无法正常运行。将XmlReader传递给StreamWriter无效。最后我没有最终以这种方式将压缩与验证结合起来,所以我没有完全“正确”的代码来展示这个但是不想让问题悬空。