Каковы слабые стороны XML?

Читая StackOverflow и слушая подкасты Джоэла Спольски и Джеффа Этвуда, я начинаю полагать, что многие разработчики ненавидят использование XML или, по крайней мере, стараются избегать использования XML в максимально возможной степени для хранения или обмена данными.

С другой стороны, мне очень нравится использовать XML по нескольким причинам:

  • Сериализация XML реализована на большинстве современных языков и чрезвычайно проста в использовании,
  • Будучи медленнее двоичной сериализации, сериализация XML очень полезна, когда дело доходит до использования одних и тех же данных из нескольких языков программирования или когда они предназначены для чтения и понимания человеком (даже для отладки) (JSON , например, понять сложнее),
  • XML поддерживает unicode, и при правильном использовании не возникает проблем с другой кодировкой, символами и т. Д.
  • Существует множество инструментов, упрощающих работу с XML-данными. XSLT - это пример, упрощающий представление и преобразование данных. XPath - еще один, упрощающий поиск данных,
  • XML может храниться на некоторых серверах SQL, что позволяет создавать сценарии, когда данные, которые слишком сложны, чтобы их легко хранить в таблицах SQL, должны быть сохранены и обработаны; Например, с помощью SQL нельзя напрямую манипулировать данными JSON или двоичными данными (кроме манипулирования строками, что в большинстве ситуаций является безумием),
  • XML не требует установки каких-либо приложений. Если я хочу, чтобы мое приложение использовало базу данных, я должен сначала установить сервер базы данных. Если я хочу, чтобы мое приложение использовало XML, мне не нужно ничего устанавливать,
  • XML является гораздо более явным и расширяемым, чем, например, реестр Windows или файлы INI,
  • В большинстве случаев нет проблем с CR-LF благодаря уровню абстракции, обеспечиваемому XML.

Итак, принимая во внимание все преимущества использования XML, почему так много разработчиков ненавидят его? ИМХО, проблема только в том, что:

  • XML слишком подробный и требует гораздо больше места, чем большинство других форм данных, особенно когда речь идет о кодировке Base64.

Конечно, есть много сценариев, в которых XML вообще не подходит. Сохранять вопросы и ответы SO в XML-файле на стороне сервера будет совершенно неправильно. Или, когда вы храните видео в формате AVI или кучу изображений в формате JPG, худший вариант использовать XML.

А как насчет других сценариев? Каковы слабые стороны XML?


Людям, которые считали, что это не настоящий вопрос:

Вопреки таким вопросам, как незамкнутый Значительные новые изобретения в вычислительной технике с 1980 года, мой вопрос является очень ясным вопросом и ясно предлагает объяснить, какие слабые места испытывают другие люди при использовании XML и почему им это не нравится. Он не приглашает к обсуждению, например, хорошего или плохого XML. Это также не требует расширенных обсуждений; Таким образом, полученные на данный момент ответы краткие и точные и содержат достаточно информации, которую я хотел.

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

Согласно SO, «не настоящий вопрос» - это вопрос, на который «трудно сказать, что здесь задают. Этот вопрос неоднозначный, расплывчатый, неполный или риторический, и на него нельзя разумно ответить в его нынешней форме».

  • О чем здесь спрашивают: я думаю, что сам вопрос очень ясен, и несколько абзацев текста выше делают его еще яснее,
  • Этот вопрос неоднозначный, расплывчатый, неполный: опять же, здесь нет ничего двусмысленного, расплывчатого или неполного,
  • или риторический: это не так: ответ на мой вопрос не является очевидным,
  • и на них нельзя разумно ответить: несколько человек уже дали отличные ответы на вопрос, показывая, что на вопрос можно ответить разумно.

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


person Community    schedule 27.08.2010    source источник
comment
Обсуждение - это здорово, но из FAQ: Избегайте вопросов, которые являются субъективными, аргументированными или требуют расширенного обсуждения. Это не доска обсуждений, это место для вопросов, на которые можно ответить! Где я могу найти интересные обсуждения программирования?   -  person    schedule 27.08.2010


Ответы (6)


Некоторые слабые места:

  • Связать XML-файлы и внешние ресурсы несколько сложно, поэтому в новых форматах документов Office используется zip-конверт, который включает скелетный xml-файл и файлы ресурсов, объединенные вместе. Другой вариант использования кодировки base64 очень подробный и не допускает хорошего произвольного доступа, что подводит нас к следующему пункту:
  • Произвольный доступ затруднен. Ни один из двух традиционных режимов чтения XML-файла - создание модели DOM или чтение в стиле SAX только вперед - не допускает действительно произвольного доступа.
  • Одновременный доступ на запись к различным частям файла затруднен, поэтому его использование в исполняемых манифестах Windows подвержено ошибкам.
  • Какая кодировка используется в XML-файле? Строго говоря, вы сначала угадываете кодировку, затем читаете файл и проверяете правильность кодировки.
  • Версии отдельных частей файла затруднительны. Поэтому, если вы хотите обеспечить детальное управление версиями, вам необходимо разделить данные. Это не только проблема формата файла, но также из-за того, что инструменты обычно предоставляют семантику для каждого файла - инструменты контроля версий, инструменты синхронизации, такие как DropBox и т. Д.
person Community    schedule 27.08.2010
comment
Думаю, лучшее (то есть худшее) вы оставили напоследок. Мне еще предстоит увидеть инструмент сравнения XML, который стоило бы разобраться, как его использовать. - person Robert Rossney; 28.08.2010

Я не тот человек, чтобы спрашивать, так как я сам большой поклонник xml. Однако могу сказать вам одну из основных жалоб, которые я слышал:

С этим сложно работать. Здесь жесткий означает, что требуется знание API и что вам нужно будет написать относительно много кода для синтаксического анализа вашего xml. Хотя я бы не сказал, что это действительно так сложно, я могу только согласиться с тем, что к языку, предназначенному для описания объектов, легче получить доступ при использовании языка, поддерживающего динамически создаваемые объекты.

person Community    schedule 27.08.2010

Я думаю, что в целом реакция вызвана просто чрезмерным использованием XML.

Однако, если есть одно слово, которое я сильно ненавижу в XML, так это пространства имен. Потеря производительности из-за проблем с пространством имен ужасна.

person Community    schedule 27.08.2010
comment
Такая реакция часто возникает у людей, которые не понимают пространства имен XML. - person John Saunders; 27.08.2010
comment
@John Saunders: Я согласен с Ишаем: даже когда вы разбираетесь в пространствах имен XML, у вас может быть много проблем с этим, поскольку некоторые API-интерфейсы очень недружелюбны, а документация - неполная. Хорошим примером является PHP-реализация XPath. По крайней мере, было в 2008 году, когда я использовал его в последний раз. - person Arseni Mourzenko; 27.08.2010
comment
@MainMa: звучит как веская причина не использовать PHP. Я надеюсь, что они исправили это, чтобы внедрить стандарты предыдущего десятилетия. - person John Saunders; 27.08.2010
comment
@ Джон Сондерс, это не из-за непонимания их. Учтите это: stackoverflow.com/questions/3314292/. Конечно, все неправильно понимают пространства имен - инструменты (PHP), разработчики (команда слюнявчиков) и т.д. В итоге, ужасающие уровни потери производительности по проблеме, которая не важна для случая использования 80%. - person Yishai; 27.08.2010
comment
@Yishai: Я бы сказал, что изменение пространства имен без предоставления инструментов миграции означает непонимание пространств имен. - person John Saunders; 27.08.2010
comment
@John, но я хочу сказать, что как человек, выбирающий формат, вы должны быть обеспокоены тем, что инструменты, с которыми вы работаете, не смогут решить проблемы с пространством имен, потому что, по-видимому, они недостаточно понятны (независимо от того, насколько хорошо вы их понимаете). - person Yishai; 27.08.2010
comment
@Yishai: Я уверен, что я буду считаться противоположным, когда скажу, что это не новый стандарт. Первая версия была выпущена в 1999. Любые инструменты, не поддерживающие пространства имен XML, должны быть немедленно отвергнуты и подвергнуты публичному осмеянию. У нас не может быть нескольких разновидностей стандартов, таких как XML, иначе XML не будет стандартом. С любым программным обеспечением, не поддерживающим этот стандарт, следует обращаться как с тараканом и топтанием или как с наркоманом - не включайте его, просто отключите. - person John Saunders; 28.08.2010
comment
Не могу не согласиться. Инструмент, который не поддерживает должным образом пространства имен, представляет собой такую ​​же угрозу, как и инструмент, который предполагает, что атрибуты упорядочены. - person Robert Rossney; 28.08.2010

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

Проблема, на мой взгляд, в том, что XML часто используется не для аннотирования текста, а для представления структурированных данных, что является тонким, но важным отличием. На практике структурированные данные должны быть краткими по разным причинам. Производительность очевидна, особенно когда пропускная способность ограничена. Вероятно, это одна из основных причин, почему JSON так популярен для веб-приложений. Краткое представление структуры данных по сети означает лучшую масштабируемость.

К сожалению, JSON не очень хорошо читается без дополнительных пробелов, которые почти всегда опускаются. С другой стороны, если вы когда-либо пробовали редактировать большой XML-файл с помощью редактора командной строки, это также может быть очень неудобно.

Лично я считаю, что YAML обеспечивает хороший баланс между двумя крайностями. Сравните следующее (скопировано с yaml.org с небольшими изменениями).

YAML:

invoice: 34843
  date: 2001-01-23
  billto: &id001
    given: Chris
    family: Dumars
    address:
      lines: |
        458 Walkman Dr.
        Suite #292
      city: Royal Oak
      state: MI
      postal: 48046
  shipto: *id001
  product:
  - sku: BL394D
    quantity: 4
    description: Basketball
    price: 450.00
  - sku: BL4438H
    quantity: 1
    description: Super Hoop
    price: 2392.00
  tax : 251.42
  total: 4443.52
  comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

XML:

<invoice>
   <number>34843</number>
   <date>2001-01-03</date>
   <billto id="id001">
      <given>Chris</given>
      <family>Dumars</family>
      <address>
        <lines>
          458 Walkman Dr.
          Suite #292
        </lines>
        <city>Royal Oak</city>
        <state>MI</state>
        <postal>48046</postal>
      </address>
   </billto>
   <shipto xref="id001" />
   <products>
      <product>
        <sku>BL394D</sku>
        <quantity>4</quantity>
        <description>Basketball</description>
        <price>450.00</price>
      </product>
      <product>
        <sku>BL4438</sku>
        <quantity>1</quantity>
        <description>Super Hoop</description>
        <price>2392.00</price>
      </product>
   </products>
   <tax>251.42</tax>
   <total>4443.52</total>
   <comments>
    Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338
   </comments>
</invoice>

Оба они представляют одни и те же данные, но YAML более чем на 30% меньше и, возможно, более читабелен. Что бы вы предпочли изменить в текстовом редакторе? Существует множество библиотек для синтаксического анализа и генерации YAML (например, snakeyaml для разработчиков Java).

Как и во всем, правильный инструмент для правильной работы - лучшее правило, которому нужно следовать.

person Community    schedule 27.08.2010

Моя любимая неприятная проблема связана с форматами сериализации XML, которые используют атрибуты, например XAML.

Это работает:

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding CurrentSelection}"/>

Это не так:

<ListBox SelectedItem="{Binding CurrentSelection}" ItemsSource="{Binding Items}"/>

Десериализация XAML назначает значения свойств по мере их чтения из потока XML. Итак, во втором примере, когда назначено свойство SelectedItem, ItemsSource элемента управления еще не установлено, а свойство SelectedItem назначается элементу, о существовании которого еще известно.

Если вы используете Visual Studio для создания файлов XAML, все будет хорошо, потому что Visual Studio поддерживает порядок атрибутов. Но измените свой XAML в каком-нибудь XML-инструменте, который верит в рекомендацию XML, когда говорит, что порядок атрибутов не имеет значения, и, черт возьми, вы попали в мир боли.

person Community    schedule 27.08.2010
comment
@Robert: это ошибка в XAML, и вам следует пожаловаться в Microsoft. Они должны понимать, что если они основывают формат на XML, они должны придерживаться стандартов XML. Период. Порядок атрибутов не может быть значимым. - person John Saunders; 28.08.2010
comment
На самом деле это не ошибка. Ошибки можно исправить. Нет реального способа исправить XAML (или любой формат сериализации, который использует атрибуты для представления свойств), чтобы его можно было использовать только для сериализации свойств, порядок присвоения которых не имеет значения. Вы могли бы полностью удалить возможность использования атрибутов из XAML, но это сделало бы XAML намного, намного менее пригодным для использования. - person Robert Rossney; 28.08.2010
comment
@John, когда дело доходит до нарушений XML со стороны Microsoft, я бы даже не сказал, что это верхний уровень. Как насчет того, чтобы сгенерировать XML и соответствующий XSD, но сделать XML недействительным в соответствии с их собственным XSD? Так обстоит дело с удаленным взаимодействием .NET. - person Yishai; 29.08.2010
comment
@Robert: Также не рекомендуется иметь объект со свойствами, которые необходимо инициализировать в определенном порядке. Возможно, это основная ошибка. - person John Saunders; 29.08.2010
comment
@Yishai: Удаленное взаимодействие .NET больше не имеет значения. Если вы обнаружите подобную ситуацию с WCF, сообщите об этом. - person John Saunders; 29.08.2010
comment
@ Джон, если вам нужно интегрироваться с поставщиком, который предоставляет это, это имеет значение ... - person Yishai; 29.08.2010
comment
@Yishai: я имел в виду вопросы для Microsoft с точки зрения сообщения об ошибках. - person John Saunders; 29.08.2010
comment
Я в принципе согласен с тем, что это не лучшая практика, Джон. Но какая разумная альтернатива существует в случае класса, который имеет Items коллекцию и SelectedItem свойство? Позволить SelectedItem быть установленным на то, чего нет в Items, - это очень плохо. Я топнул ногой и получил крест, но это еще не привело к решению. - person Robert Rossney; 29.08.2010

person    schedule
comment
Я все больше убеждаюсь, что M в XML предназначена для madlib. - person tadamson; 27.08.2010