Можно ли сжать Xml с помощью </> для завершения элементов? - PullRequest
5 голосов
/ 26 января 2009

Есть ли причина, по которой XML такой, как этот:

<person>    
    <firstname>Joe</firstname>    
    <lastname>Plumber</lastname>
</person>

не может быть сжато так для передачи клиент / сервер.

<person>    
    <firstname>Joe</>    
    <lastname>Plumber</>
</>

Это будет меньше - и немного быстрее разобрать.

Предполагая, что нет граничных условий, означающих, что это не сработает - есть ли библиотеки, чтобы сделать это?

Гуглить это сложно, получается:

Ваш поиск - </> - не соответствует ни одному документы.

Предложения:

Попробуйте другие ключевые слова.

Редактировать: Кажется, путаница в том, что я спрашиваю. Я говорю о моей собственной форме сжатия. Я полностью осознаю, что в нынешнем виде это НЕ XML. Сервер и клиент должны быть «включены в схему». Это было бы особенно полезно для схем с очень длинными именами элементов, поскольку полоса пропускания, занимаемая этими именами элементов, будет уменьшена вдвое.

Ответы [ 14 ]

8 голосов
/ 26 января 2009

Если вы написали процедуру сжатия, которая это сделала, то да, вы могли бы сжать поток и восстановить его на другом конце.

Причины, по которым это не сделано:

  • уже существуют более совершенные схемы сжатия, независимые от XML (с точки зрения степени сжатия и, вероятно, с точки зрения ЦП и пространства) - определенный документ 7 N UTF-8 получит сжатие 14%, но для его распаковки потребуется пространство не менее 2 N байт вместо постоянного пространства, требуемого большинством алгоритмов распаковки.
  • гораздо лучшие схемы сжатия с поддержкой XML уже существуют (google 'binary xml'). Для сжатия с учетом схемы схемы, основанные на ASN.1, дают намного лучше, чем уменьшение размера, выделенного для указания типа элемента, наполовину.
  • декомпрессор должен проанализировать нестандартный XML и сохранить стек открытых тегов, с которыми он столкнулся. Таким образом, если вы не подключите его вместо анализатора, вы удвоите стоимость анализа. Если вы подключаете его вместо парсера, вы смешиваете разные слои, что может вызвать путаницу в какой-то момент
5 голосов
/ 26 января 2009

Как вы говорите, это не XML, так зачем делать его похожим на XML? Вы уже потеряли возможность использовать любые парсеры или инструменты XML. Я бы либо

  • Используйте XML и сожмите его по проводам, так как вы увидите гораздо большую экономию, чем при использовании собственной схемы
  • Используйте другой более компактный формат, например YAML или JSON
5 голосов
/ 26 января 2009

Если вам нужно лучшее сжатие и более простой анализ, вы можете попробовать использовать атрибуты XML:

<person firstname="Joe" lastname="Plumber" />
5 голосов
/ 26 января 2009

Это не допустимый XML. Закрывающие теги должны быть названы. В противном случае он потенциально подвержен ошибкам, и, честно говоря, я думаю, что он будет менее читабельным по-вашему.

В отношении вашего пояснения о том, что это нестандартное нарушение стандарта XML для экономии нескольких байтов, это невероятно плохая идея по нескольким причинам:

  1. Это нестандартно и, возможно, потребуется поддержка в далеком будущем;
  2. Стандарты существуют по причине. Стандарты и соглашения обладают большой силой, и наличие «пользовательского XML» стоит в одном ряду с графическими дизайнерами Ivory Tower, которые вынуждают программистов писать замену пользовательских кнопок, потому что стандартная не может делать ничего странного, удивительного и запутанного поведения, придуманного;
  3. Сжатие Gzip легко и намного эффективнее и не будет нарушать стандарты. Если вы видите поток октетов gzip, его нельзя принять за XML. Реальная проблема с сокращенной схемой, которая у вас есть, состоит в том, что она все еще находится наверху, так что какой-то плохой ничего не подозревающий парсер может ошибиться, считая ее действительной, и выдать другую, вводящую в заблуждение ошибку;
  4. Теория информации: сжатие работает путем устранения избыточности информации. Если вы сделаете это вручную, это сделает сжатие gzip более неэффективным, поскольку передается одинаковое количество информации;
  5. Существуют значительные издержки при преобразовании документов в и из этой схемы. Это невозможно сделать с помощью стандартного синтаксического анализатора XML, поэтому вам придется эффективно написать собственный синтаксический анализатор и обработчик XML, который понимает эту схему (на самом деле преобразование в этот формат можно выполнить с помощью синтаксического анализатора; получить его обратно сложнее), что много работы (и много ошибок).
4 голосов
/ 27 января 2009

Есть ли причина, по которой

С философской точки зрения SGML разрешил разрешать </> закрывать теги. Были дебаты о включении этого в стандарт XML. Причиной отказа было то, что пропуск имен в конечных тегах иногда приводил к снижению читаемости XML. Итак, это «причина, почему».

Трудно превзойти существующие уровни сжатия текста, но одним из преимуществ вашей схемы "сжатия" является то, что XML остается читаемым человеком на проводе. Другое преимущество состоит в том, что если вам нужно вводить XML вручную (например, для тестирования), то (незначительное) удобство - не закрывать конечные теги. То есть, он более доступен для записи , чем стандартный XML. Я говорю «второстепенный», потому что большинство редакторов выполнят для вас завершение строки (например, ^ n и ^ p в vim).

Чтобы убрать закрывающие теги : самое простое - использовать что-то вроде этого: s_</[a-zA-Z0-9_$]+>_</>_ (это неправильное регулярное выражение QName, но вы поняли идею).

Чтобы добавить их обратно : вам нужен специальный анализатор, потому что SAX и другие анализаторы XML не распознают это (так как это не «XML»). Но (самый простой) синтаксический анализ просто должен распознавать имена открытых тегов и имена закрытых тегов.

have a stack.
scan the XML, and output it, as-is.
if you recognize an open tag, push its name.
if you recognize close tag, pop to get its name, and
  insert that in the output (you can do this even when there is a proper close tag).

Кстати (в ответ на комментарий выше), это работает, потому что в XML закрывающий тег может соответствовать только самому последнему открытому тегу. То же, что и вложенные скобки.

Однако я думаю, что вы правы, что кто-то наверняка уже сделал это. Может, проверить репозитории Python или Perl?

РЕДАКТИРОВАТЬ: Вы можете дополнительно опустить завершающий </>, поэтому ваш пример становится (когда анализатор видит EOF, он добавляет закрывающие теги для всего, что осталось в стеке):

<person>    
    <firstname>Joe</>    
    <lastname>Plumber
4 голосов
/ 26 января 2009

Если размер данных является проблемой, XML не для вас.

3 голосов
/ 26 января 2009

Вы описываете SGML , который использует </> для завершения ближайшего предыдущего непустого тега.

2 голосов
/ 26 января 2009

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

Если вам нужно сжатие, XML очень удобен для gzip.

1 голос
/ 26 января 2009

Вам может быть интересно прочитать о различных форматах тегов в SGML . Например, следующее может быть допустимым SGML:

<p/This paragraph contains a <em/bold/ word./

К счастью, разработчики XML решили опустить эту конкретную главу безумия.

0 голосов
/ 26 января 2009

Не беспокойтесь о текстовой оптимизации вашего XML и ухудшении качества чтения / записи. Используйте сжатие deflate, чтобы сжать вашу полезную нагрузку между клиентом и сервером. Я сделал несколько тестов, и сжатие обычного 10k XML-файла приводит к 2.5k blub. Удаление всех имен конечных тегов конечной точки уменьшает исходный размер файла до 9 КБ, но после дефлирования он снова становится 2,5 КБ. Это очень хороший пример того, что словарное сжатие является простым способом сжатия полезных нагрузок между конечными точками. "" и "" будут (почти) использовать один и тот же пробел в сжатых данных.

Единственное исключение будет, если файлы / данные будут очень маленькими, а затем сжимаемыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...