【问题标题】:Compress XML during XMLReader.Read()在 XMLReader.Read() 期间压缩 XML
【发布时间】:2011-02-03 16:57:32
【问题描述】:

我有一个方法,它使用XMLReader(同时验证)循环通过XML 文档提取特定的信息。我还需要压缩整个 XML 文档,以准备将其存储在数据库中。我必须这样做的代码如下。 这是(将整个XmlReader 传递给StreamWriter.Write()实现此目的的适当/最有效方法?我没有看到使用@ 的明确方法987654324@循环达到同样的效果。

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

        }
    }
}

【问题讨论】:

    标签: c# xml compression xmlreader


    【解决方案1】:

    压缩部分看起来不错。 MemoryStream 可能不是大型文档的最佳选择,但在更改之前检查性能是否适合您的场景。

    “提取特定元素”部分不会读取任何内容,因为阅读器只是向前的,因此在该部分执行时所有内容都已被读取。您可能需要重新创建阅读器。

    【讨论】:

    • 压缩结果小于5Mb。我认为这对于 MemoryStream 是可以接受的吗?有没有办法将阅读器内容写入另一个流,同时还能够提取特定的 XML 元素内容?
    • MemoryStream 可以处理任意大小,问题是它是否足够快以适合您的情况。问题是当 MemoryStream 增长时,它必须将以前的内容复制到新分配的数组中 - 可能不够快,这样做所花费的时间可能在大型 (~1MB+) 流上是可测量的。
    • 我不知道如何简单地编写阅读器内容以同时流式传输和提取元素。
    • 如果您担心数据太大,请在文件流之上使用 BufferedStream 而不是 MemoryStream
    【解决方案2】:

    供将来参考:

    问题中的代码无法正常工作。将 XmlReader 传递给 StreamWriter 无法按预期工作。最后,我并没有以这种方式将压缩与验证结合起来,所以我并没有为此显示“正确”的代码,但我不想让这个问题悬而未决。

    【讨论】:

      猜你喜欢
      • 2014-06-19
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2023-01-14
      • 1970-01-01
      相关资源
      最近更新 更多