Как сжать xml файл

Обновлено: 02.07.2024

Я почти ничего не знаю о сжатии, так что потерпите меня (это, наверное, глупый и до боли очевидный вопрос).

Допустим, у меня есть XML-файл с несколькими тегами.

Теперь предположим, что у меня есть куча этих очень длинных тегов со многими атрибутами в нескольких моих файлах XML. Мне нужно сжать их до минимально возможного размера. Лучшим способом было бы использовать алгоритм, специфичный для XML, который присваивает отдельным тегам псевдонимы, такие как vlt1 или vlt2. Однако это не будет таким «открытым» способом, как я пытаюсь пойти, и я хочу использовать общий алгоритм, такой как DEFLATE или LZ. Также помогает, если архив был файлом .zip.

Поскольку я имею дело с обычным текстом (без двоичных файлов, таких как изображения), мне нужен алгоритм, который подходит для обычного текста. Какой из них дает наименьший размер файла (предпочтительны алгоритмы без потерь)?

Между прочим, сценарий таков: я создаю стандарт для документов, таких как ODF или MS Office XML, которые содержат файлы XML, упакованные в .zip.

РЕДАКТИРОВАТЬ: «Шифрование» было опечаткой; он должен быть «сжатым».

Существует стандарт W3 (еще не выпущенный) под названием EXI (эффективный обмен XML) .

Должен стать в будущем форматом данных для сжатия XML-данных (заявленный как последний необходимый двоичный формат). Оптимизированный для XML, он сжимает XML более эффективно, чем любой традиционный алгоритм сжатия.

С EXI вы можете работать со сжатыми XML-данными на лету (без необходимости распаковывать или повторно сжимать их).

EXI = (XML + XMLSchema) как двоичный.

И вот вам реализация с открытым исходным кодом (не знаю, стабильна ли она):
Exificient

Да, лучше всего использовать * .zip. Кровавые подробности содержатся в этом документе USENIX показывает, что «оптимальные» компрессоры не стоят вычислительных затрат, а компрессоры для конкретных областей не превосходят zip [в среднем].

Отказ от ответственности: я написал эту статью, которая, по данным Google, цитировалась более 60 раз.

Другой альтернативой «сжатию» XML может быть FI (Fast Infoset).

XML, хранящийся как FI, будет содержать каждый тег и атрибут только один раз , все остальные вхождения относятся к первому, таким образом экономя место.

Отличие от EXI с точки зрения сжатия состоит в том, что Fast Infoset (представляющий собой структурированный открытый текст) менее эффективен.

Похоже, вас больше интересует сжатие, а не шифрование. Так ли это? В таком случае это может оказаться интересным для чтения, даже если он не точное решение.

Между прочим, сценарий таков: я создаю стандарт для документов, таких как ODF или MS Office XML, которые содержат файлы XML, упакованные в .zip .

Тогда я бы посоветовал вам использовать сжатие .zip, иначе ваши пользователи запутаются.

Надеюсь, я правильно понял, что вам нужно сделать . Первое, что я хотел бы сказать, это то, что нет хороших или плохих алгоритмов сжатия для текста - zip, bzip, gzip, rar, 7zip достаточно хороши, чтобы сжать все, что имеет низкая энтропия - т.е. большой файл с маленьким набором символов. Если бы мне пришлось их использовать, я бы выбрал 7zip при первом выборе, rar как второй и zip как третий. Но разница очень мала, поэтому вам стоит попробовать то, что вам проще. Во-вторых, я не мог понять, что вы пытаетесь зашифровать. Предположим, что это XML-файл, тогда вы должны сначала сжать его, используя свой любимый алгоритм сжатия, а затем зашифровать его, используя свой любимый алгоритм шифрования. В большинстве случаев любой современный алгоритм, реализованный, например, в PGP, будет достаточно безопасен для чего угодно. Надеюсь, это поможет.

Ни один из значений по умолчанию не идеален для XML, но вы все равно получите хорошие значения, поскольку существует много повторяющихся значений.

Поскольку XML использует много повторов (теги.>), Вы хотите, чтобы их было меньше, чем немного, поэтому используйте некоторую форму арифметики, а не кодирование Хаффмана. Так что rar / 7zip теоретически должен быть значительно лучше . эти алгоритмы обеспечивают высокое сжатие, поэтому они медленнее. В идеале вам нужно простое сжатие с помощью арифметического кодировщика (что для XML было бы быстрым и давало бы высокое сжатие).

Читайте также: