Рекомендация

Cжимайте файлы XML для эффективной передачи

Зачем использовать двоичный XML, если доступно хорошее сжатие?

Comments

Серия контента:

Этот контент является частью # из серии # статей: Рекомендация

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Рекомендация

Следите за выходом новых статей этой серии.

Идея двоичного XML всегда витала где-то на границах разговоров об XML. XML является крайне многословным форматом вследствие его текстового происхождения и многочисленных правил, которые он налагает для обеспечения дружественности в отношении интернационализированного текста. Эквивалентный двоичный синтаксис был бы намного более компактным. В одной из своих предыдущих статей (от 2000 года) «XML: будущее EDI?» (см. раздел Ресурсы) я продемонстрировал преобразование части транзакции заказа на покупку из формата ANSI EDI X12 (двоичного) в формат XML. Объем результирующих данных в формате XML более чем в восемь раз превысил размер исходного сообщения EDI (некоторые другие тесты преобразования XML/EDI демонстрировали увеличение лишь примерно в три раза). Подобная многословность вызывает определенную озабоченность в отношении хранения XML, но успокаивает то, что устройства хранения в наши дни являются дешевыми. Пропускная способность каналов передачи обычно более ограничена. Самые громкие призывы к созданию двоичного XML исходили от тех, кто использовал XML в качестве формата передачи сообщений, включая некоторых пользователей Web-сервисов.

Развить навыки по этой теме

Этот материал — часть knowledge path для развития ваших навыков. Смотри:

Одним из подходов, позволяющим достигнуть сжатия XML, является принятие какого-либо формата, изначально приспособленного для двоичных данных. Основным кандидатом является ASN.1 ISO/ITU — стандарт передачи данных, который предшествовал XML. Обновленный ASN.1 включает несколько связанных с XML возможностей, которые позволяют переформулировать форматы XML в специализированные формы (например, правила компактного кодирования ASN.1), предусматривающие очень компактное двоичное кодирование. В качестве примера можно назвать инициативу UBL консорциума OASIS, предусматривающую применение подхода ASN.1 для сжатия данных XML.

Сжатие для кодирования SOAP

Если вам нужно передавать XML с использованием Web-сервисов, может оказаться, что передаваемые данные являются слишком многословными. Если это так, вы можете использовать один из многочисленных вариантов сжатия текста для XML-контента. В листинге 1 приведен пример XML/EDI, который я представил в упомянутой выше статье.

Листинг 1. Образец документа XML для обмена данными с использованием Web-сервисов
<?xml version="1.0" encoding="UTF-8"?>
<PurchaseOrder Version="4010">
<PurchaseOrderHeader>
  <TransactionSetHeader X12.ID="850">
    <TransactionSetIDCode code="850"/>
    <TransactionSetControlNumber>12345</TransactionSetControlNumber>
  </TransactionSetHeader>
  <BeginningSegment>
    <PurposeTypeCode Code="00 Original"/>
    <OrderTypeCode Code="SA Stand-alone Order"/>
    <PurchaseOrderNumber>RET8999</PurchaseOrderNumber>
    <PurchaseOrderDate>19981201</PurchaseOrderDate>
   </BeginningSegment>
  <AdminCommunicationsContact>
    <ContactFunctionCode Code="OC Order Contact"/>
    <ContactName>Obi Anozie</ContactName>
  </AdminCommunicationsContact>
</PurchaseOrderHeader>
<PurchaseOrderDetail>
  <Name1InformationLOOP>
    <Name>
      <EntityIdentifierCode Code="BY Buying Party"/>
      <EntityName>Internet Retailer Inc.</EntityName>
      <IdentificationCodeQualifier Code="91 Assigned by Seller"/>
      <IdentificationCode>RET8999</IdentificationCode>
    </Name>
    <Name>
      <EntityIdentifierCode Code="ST Ship To"/>
      <EntityName>Internet Retailer Inc.</EntityName>
    </Name>
    <AddressInformation>123 Via Way</AddressInformation>
    <GeographicLocation>
      <CityName>Milwaukee</CityName>
      <StateProvinceCode>WI</StateProvinceCode>
      <PostalCode>53202</PostalCode>
    </GeographicLocation>
  </Name1InformationLOOP>
  <BaselineItemData>
    <QuantityOrdered>100</QuantityOrdered>
    <Unit Code="EA Each"/>
    <UnitPrice>1.23</UnitPrice>
    <PriceBasis Code="WE Wholesale Price per Each"/>
    <ProductIDQualifier Code="MG Manufacturer Part Number"/>
    <ProductID Description="Fuzzy Dice">CO633</ProductID>
  </BaselineItemData>
</PurchaseOrderDetail>
</PurchaseOrder>

Исходный пример в формате EDI имеет размер 200 байт, а версия XML — 1721 байт.

Хорошо известная программа PK-ZIP сжимает этот XML-файл до 832 байт.

Программа GNU gzip сжимает этот файл до 707 байт.

Программа с открытым исходным кодом bzip2 сжимает этот файл до 748 байт.

Ни один из результатов не получается столь же компактным, как специализированный формат EDI, что вполне объяснимо. Утилита bzip2 знаменита своей способностью обеспечивать более высокую степень сжатия большого количества файлов (при меньшей скорости сжатия), чем gzip, однако представленные здесь результаты типичны для моих наблюдений: gzip обрабатывает XML лучше, чем bzip2.

Большинство платформ и языков в наши дни имеет библиотеки по меньшей мере для сжатия PK-ZIP и GNU gzip, которое можно применять программно перед вызовом Web-сервиса.

Обязательно проанализируйте влияние каноникализации (C14N) на сжатие (в сторону улучшения или ухудшения) в вашем случае. C14N — это стандартный метод генерирования физического представления документа XML, имеющего каноническую форму, в котором принимаются во внимание вариации, допустимые в синтаксисе XML при условии сохранения смысла. В качестве грубого эмпирического правила приведем следующее: если XML редактируется вручную с множеством потенциальных вариаций в порядке атрибутов и использовании интервалов, C14N может улучшить характеристики сжатия документов большого размера. Однако если XML генерируется машиной или предусматривает использование множества пустых элементов, C14N может оказать негативное влияние. Мой пример ближе к последней категории. Я каноникализировал его с помощью модуля C14N из проекта PyXML. Код на языке Python выглядит следующим образом:

>>> from xml.dom import minidom
>>> from xml.dom.ext import c14n
>>> doc = minidom.parse('listing1.xml')
>>> c14n.Canonicalize(doc)
>>> f = open('listing1-canonical.xml', 'w')
>>> c14n.Canonicalize(doc, output=f)
>>> f.close()

Результирующий файл listing1-canonical.xml имеет размер 1867 байт, а после сжатия с помощью утилиты gzip — 714 байтов. Версия в виде простого текста больше на 146 байт, а результат работы gzip — больше на 7 байт. Основная причина этого заключается в том, что после C14N пустые элементы выражаются в своей наиболее многословной форме. Например, следующая строка...

<Unit Code="EA Each"/>

...превращается в строку

<Unit Code="EA Each"></Unit>

Для упаковки сжатого XML (например, результата работы gzip) в SOAP можно воспользоваться двумя способами:

  • использование какого-либо способа присоединения;
  • использование кодирования (например, Base64) для включения в тело сообщения.

Кодирование Base64 позволяет передавать двоичные документы с использованием лишь обычных текстовых символов. Вероятно, вы сможете реализовать его с использованием легкодоступных библиотек на любой платформе. Для кодированных данных Base64 даже имеется тип XML-схемы W3C, при этом ваши инструментальные средства, возможно, смогут автоматизировать кодирование и декодирование Base64, если вы должным образом настроите Web-сервис. К сожалению, применение кодирования Base64 немного уменьшает эффективность сжатия. Соотношение размеров кодированного документа Base64 и оригинала составляет 4:3. Итоговый размер файла после обработки утилитой gzip и кодирования Base64 для листинга 1 составляет 957 байт.

Заключение

В целом после применения gzip к XML-файлу и кодирования сжатого результата с помощью Base64 для встроенной доставки в SOAP размер итогового файла зачастую оказывается вдвое меньше размера оригинала. Этого может оказаться достаточно для удовлетворения потребностей в экономии пространства в Web-сервисах XML. Если же этого мало, внимательнее присмотритесь к ASN.1.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, SOA и web-сервисы
ArticleID=946445
ArticleTitle=Рекомендация: Cжимайте файлы XML для эффективной передачи
publish-date=04252013