.NET zlib Поток, совместимый с Actionscript ByteArray.uncompress

Это должно помочь вам:

for (int i = nodeList.Count - 1; i >= 0; i--)
{
    nodeList[i].ParentNode.RemoveChild(nodeList[i]);
}

Если вы зациклились, используя обычный цикл for, и зациклили его «назад», вы можете удалять элементы по ходу.

Обновление: вот полный пример, включающий загрузку XML-файла, поиск узлов, их удаление и сохранение файла:

XmlDocument doc = new XmlDocument();
doc.Load(fileName);
XmlNodeList nodes = doc.SelectNodes("some-xpath-query");
for (int i = nodes.Count - 1; i >= 0; i--)
{
    nodes[i].ParentNode.RemoveChild(nodes[i]);
}
doc.Save(fileName);
6
задан Agent_9191 13 October 2009 в 21:39
поделиться

2 ответа

ZLIB и DEFLATE - это не одно и то же. Существует набор из трех связанных спецификаций сжатия, определенных в IETF RFC:

Все они используют (в основном) конкретный алгоритм сжатия - DEFLATE.

Как ZLIB соотносится с DEFLATE

Первый, ZLIB, включает в себя байты кадрирования. Согласно RFC 1950 ...

  A zlib stream has the following structure:

       0   1
     +---+---+
     |CMF|FLG|   (more-->)
     +---+---+

  (if FLG.FDICT set)

       0   1   2   3
     +---+---+---+---+
     |     DICTID    |   (more-->)
     +---+---+---+---+

     +=====================+---+---+---+---+
     |...compressed data...|    ADLER32    |
     +=====================+---+---+---+---+

CMF и FLG являются байтами. Как сказано в спецификации, основным методом сжатия , используемым в ZLIB, является DEFLATE, хотя спецификация может использоваться с другими методами. В общем, нет. Кроме того, DICTID обычно не используется . Следовательно, каждый поток байтов ZLIB имеет 2 байта, за которыми следует поток сжатых данных, за которым следует контрольная сумма Adler32. Сжатые данные представляют собой чистый поток байтов от DEFLATE.

Как GZIP соотносится с DEFLATE

Это касается того, чем ZLIB отличается от DEFLATE как формата. GZIP - это третий формат. Если вам нужны подробности, проверьте RFC. Ключевым моментом является то, что, как и ZLIB, GZIP в основном использует DEFLATE и помещает заголовок перед сжатым потоком данных, а затем контрольную сумму. Но заголовок GZIP отличается от заголовка ZLIB, поэтому любой класс GZipStream не сможет записать поток байтов, который будет читаться как ZLIB. И наоборот.

Решение проблемы

При чтении потока ZLIB, некоторые люди решают проблему, с которой вы столкнулись , используя встроенный .NET DeflateStream в потоке данных после продвижения потока мимо первых двух байтов кадра ZLIB. Это работает, пока вы хотите ПРОЧИТАТЬ, поток ZLIB использует DEFLATE (безопасное предположение) и не определяет фиксированный словарь (также довольно безопасно), и если вас не заботит проверка целостности, предоставляемая Adler32 (возможно).

Если вам не нравится делать такие предположения или отказываться от проверки, или если вам нужно генерировать поток данных ZLIB, есть ZlibStream в DotNetZip , который будет читать и записывать потоки данных ZLIB за вас, а также проверять или производить контрольную сумму по мере необходимости.

DotNetZip можно использовать бесплатно, работает с любым языком .NET. Вам не нужна полная библиотека DotNetZip, вместо этого вам нужен только Ionic.Zlib.dll.

t заботиться о проверке целостности, предоставляемой Adler32 (возможно).

Если вам не нравится делать такие предположения или отказываться от проверки, или если вам нужно генерировать поток данных ZLIB, есть ZlibStream в DotNetZip , который будет читать и записывать потоки данных ZLIB за вас, а также проверять или производить контрольную сумму по мере необходимости.

DotNetZip можно использовать бесплатно, работает с любым языком .NET. Вам не нужна полная библиотека DotNetZip, вместо этого вам нужен только Ionic.Zlib.dll.

t заботиться о проверке целостности, предоставляемой Adler32 (возможно).

Если вам не нравится делать такие предположения или отказываться от проверки, или если вам нужно генерировать поток данных ZLIB, есть ZlibStream в DotNetZip , который будет читать и записывать потоки данных ZLIB за вас, а также проверять или производить контрольную сумму по мере необходимости.

DotNetZip можно использовать бесплатно, работает с любым языком .NET. Вам не нужна полная библиотека DotNetZip, вместо этого вам нужен только Ionic.Zlib.dll.

и при необходимости проверить или произвести контрольную сумму.

DotNetZip можно использовать бесплатно, работает с любым языком .NET. Вам не нужна полная библиотека DotNetZip, вместо этого вам нужен только Ionic.Zlib.dll.

и при необходимости проверить или произвести контрольную сумму.

DotNetZip можно использовать бесплатно, работает с любым языком .NET. Вам не нужна полная библиотека DotNetZip, вместо этого вам нужен только Ionic.Zlib.dll.

11
ответ дан 8 December 2019 в 18:38
поделиться

Попробуйте использовать System.IO.Compression.DeflateStream или ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream . Вы получите поток DEFLATE.

В конце ActiveScript используйте uncompress с параметром deflate: uncompress (CompressionAlgorithm.DEFLATE) , как предлагает документация ActiveScript. По умолчанию ActiveScript ожидает поток ZLib, который содержит дополнительную информацию по сравнению с потоком DEFLATE.

2
ответ дан 8 December 2019 в 18:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: