Сжатие XML во время XMLReader.Read () - PullRequest
1 голос
/ 03 февраля 2011

У меня есть метод, который перебирает XML-документ, используя XMLReader (проверяющий одновременно), извлекающий определенные фрагменты информации. Мне также нужно сжать весь документ 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 голосов
/ 11 марта 2011

Для дальнейшего использования:

Код в вопросе не работает должным образом.Передача XmlReader в StreamWriter не работает должным образом.В конце концов, я не совмещал сжатие с проверкой таким образом, поэтому у меня не было «правильного» кода, чтобы показать это, но я не хотел оставлять вопрос висят

0 голосов
/ 03 февраля 2011

Сжатие выглядит нормально.MemoryStream, возможно, не лучший выбор для больших документов, но перед изменением проверьте, в порядке ли производительность для ваших сценариев.

Часть «Извлечь определенный элемент» ничего не будет читать, так как программа чтения только вперед, поэтому весь контент ужечитать к тому времени, когда эта часть выполняется.Вы можете восстановить читателя.

...