2009-07-04 7 views
26

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

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

<verylongtagnumberone> 
    <verylongtagnumbertwo> 
    text 
    </verylongtagnumbertwo> 
</verylongtagnumberone> 

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

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

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

EDIT: «шифрование» было опечаткой; это должно быть сжато ».

+4

Как это связано с шифрованием? И простой ответ - позволить ZIP сделать сжатие: он широко доступен, делает приличную работу по тексту, и не стоит времени найти «самый маленький возможный размер». – kdgregory

+0

Почему бы просто не использовать OpenXML? Это в основном то, что вы хотите :). Не уверен, что это лучшее сжатие, но мне это нравится. И если вы этого еще не знаете, OpenXML в основном представляет собой zip-файл, поэтому вы можете переименовать ваши документы Office 2007 в виде .zip-файла (т. Е. Something.docx в something.zip) и открыть его как zip-файл. Внутри - это в основном куча XML. –

+0

Вы можете просто использовать кучу XML-файлов в zip-файле и любое расширение файла, которое вы хотите.Почему очень долгозначительные ??? –

ответ

29

Существует W3 (еще не выпущенный) стандарт с именем EXI (Efficient XML Interchange).

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

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

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

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

+4

Ugh .. XML был разработан, потому что «двоичные файлы являются злыми». И теперь у нас есть эти EXI-материалы. Этот доказательный XML просто изобретал колесо. Разве мы не должны использовать ASN.1? –

+6

Некоторый нестандартный (или что-то) ASN.1 был кандидатом на EXI. Двоичные файлы ** являются злыми. EXI не является двоичным файлом в здравом смысле. Вам не нужно писать собственную реализацию для чтения/записи этого двоичного файла, и вам не нужно определять собственную структуру и систему типов. Все сделано для вас по XML + XmlSchema. –

+3

С 2011-03-10, EXI теперь является Рекомендацией W3C: http://www.w3.org/TR/exi/ –

2

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

0

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

+0

Подпись в ответе! Это новое;) –

0

Ваши альтернативы:

  • Используйте веб-сервер, который поддерживает GZIP сжатие. Он автоматически сжимает весь исходящий html. Однако есть небольшой штраф за процессор.
  • Используйте что-то вроде JSON. Это резко уменьшит размер сообщения
  • Существует также двоичный XML, но я не пробовал его сам.
+0

JSON действительно не меньше, чем xml, хотя –

1

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

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

+0

Да, плюс сжатие сжимания XML не приведет к дальнейшему сжатию. –

4

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

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

См:

Very good article on java.sun.com, и конечно
the Wikipedia entry

Разница в Exi с точки зрения сжатия является то, что Fast Infoset (структурировано открытого текста) является менее эффективным.

Другое важное различие is: FI является зрелым стандартом со многими реализациями.
Один из них: Fast Infoset Project @ dev.java.net

+0

Мы, вероятно, должны упомянуть, что причина, по которой EXI выиграла FI, заключается в том, что когда есть схема, он может содержать теги и атрибуты ZERO раз, а не один раз. –

4

Да, * .zip лучше всего на практике. Gory deets, содержащиеся в this USENIX paper, показывающие, что «оптимальные» компрессоры не стоят вычислительных затрат & Компрессоры, специфичные для домена, не вносят изменения в почтовый индекс [в среднем].

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

0

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

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

Смежные вопросы