Что плохого в построении XML с конкатенацией строк?

В ветке что вам больше всего не нравится в "программистском невежестве"? появляется следующий ответ с большим количеством голосов:

Programmers who build XML using string concatenation.

Мой вопрос: почему построение XML с помощью конкатенации строк (например, StringBuilder в C#) плохо?

Я делал это несколько раз в прошлом, так как иногда это самый быстрый способ добраться из точки А в точку Б, когда дело доходит до структур данных/объектов, с которыми я работаю. До сих пор я придумал несколько причин, почему это не самый лучший подход, но есть ли что-то, что я упускаю из виду? Почему этого следует избегать?

  1. Вероятно, самая главная причина, о которой я могу думать, заключается в том, что вам нужно экранировать ваши строки вручную, и большинство новых программистов (и даже некоторые опытные программисты) забудут об этом. Это будет отлично работать для них, когда они протестируют его, но затем «случайно» их приложения выйдут из строя, когда кто-то где-то введет символ & в свой ввод. Хорошо, я куплю это, но проблему очень легко предотвратить (SecurityElement.Escape, чтобы назвать один).
  2. Когда я это делаю, я обычно опускаю объявление XML (т.е. <?xml version="1.0"?>). Это вредно?
  3. Штрафы за производительность? Если вы придерживаетесь правильной конкатенации строк (например, StringBuilder), стоит ли об этом беспокоиться? Предположительно, такой класс, как XmlWriter, также должен будет немного манипулировать строками...
  4. Существуют более элегантные способы генерации XML, например использование XmlSerializer для автоматической сериализации/десериализации ваших классов. Хорошо, конечно, я согласен. В C# есть масса полезных классов для этого, но иногда я не хочу создавать класс для чего-то действительно быстрого, например для записи файла журнала или чего-то подобного. Это только мне лень? Если я делаю что-то "настоящее", это мой предпочтительный подход для работы с XML.

person wsanville    schedule 14.06.2010    source источник


Ответы (12)


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

person cdonner    schedule 14.06.2010
comment
+1 - Часто потребителю сломанного XML остается задача найти обходной путь для неисправности. ВОТ почему это получает ярлык любимой мозоли! - person Stephen C; 14.06.2010
comment
+1 - Как некоторый XML, который мне нужно проанализировать, где объекты являются числовыми. Орхл. - person Rob; 14.06.2010

Я думаю, что удобочитаемость, гибкость и масштабируемость являются важными факторами. Рассмотрим следующий фрагмент Linq-to-Xml:

XDocument doc = new XDocument(new XDeclaration("1.0","UTF-8","yes"),
   new XElement("products", from p in collection
    select new XElement("product",
        new XAttribute("guid", p.ProductId), 
        new XAttribute("title", p.Title),
        new XAttribute("version", p.Version))));

Можете ли вы найти способ сделать это проще, чем этот? Я могу вывести его в браузер, сохранить в документ, добавить атрибуты/элементы за считанные секунды и так далее... просто добавив пару строк кода. Я могу делать с ним практически все без особых усилий.

person S P    schedule 14.06.2010
comment
При создании большого документа может быть столько же круглых скобок, сколько и в программе на Лиспе, но я должен признать, что я тоже так делаю. - person Gregory Higley; 14.06.2010
comment
Итак, это называется Linq-to-Xml! Боже. - person Anton Tykhyy; 14.06.2010
comment
@Gregory Higley: если бы вы использовали StringBuilder, у вас была бы куча ‹ и ›, возможно, Lisp под другим именем? - person user7116; 14.06.2010
comment
@sixlettervariables: я слышал, что это называется супом с угловыми скобками. - person Gregory Higley; 15.06.2010

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

Пока альтернативами были сериализация XML и XmlDocument, я мог видеть аргумент простоты в пользу объединения строк. Однако, начиная с XDocument et. al., больше нет причин использовать string concat для построения XML. См. Ответ Сандера, чтобы узнать, как лучше написать XML.

Еще одним преимуществом XDocument является то, что XML на самом деле является довольно сложным стандартом, и большинство программистов просто не понимают его. В настоящее время я имею дело с человеком, который отправляет мне «XML» со значениями атрибутов без кавычек, отсутствующими конечными тегами, неправильной чувствительностью к регистру и неправильным экранированием. Но поскольку IE принимает его (как HTML), он должен быть правильным! Эх... В любом случае, дело в том, что конкатенация строк позволяет писать что угодно, но XDocument заставит XML соответствовать стандартам.

person Stephen Cleary    schedule 14.06.2010

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

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

Спросите себя об этом; каким набором символов я сейчас кодирую свой документ ('ascii7', 'ibm850', 'iso-8859-1' и т. д.)? Что произойдет, если я запишу строковое значение UTF-16 в XML-документ, который был вручную объявлен как «ibm850»?

Учитывая богатство поддержки XML в .NET с XmlDocument, а теперь особенно с XDocument, должен быть серьезный убедительный аргумент в пользу не использования этих библиотек вместо базовой конкатенации строк IMHO.

person Ed Courtenay    schedule 14.06.2010

Я думаю, что проблема в том, что вы не смотрите на файл xml как на логическое хранилище данных, а как на простой текстовый файл, в котором вы пишете строки.

Очевидно, что эти библиотеки выполняют за вас манипуляции со строками, но чтение/запись xml должно быть чем-то похожим на сохранение данных в базу данных или что-то логически похожее.

person Francesco Belladonna    schedule 14.06.2010

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

person Preet Sangha    schedule 14.06.2010

Вам нужно экранировать свои строки вручную. Это верно. Но это все? Конечно, вы можете положить спецификацию XML на свой стол и перепроверять каждый раз, когда вы учли все возможные крайние случаи при построении строки XML. Или вы можете использовать библиотеку, которая инкапсулирует эти знания...

person dtb    schedule 14.06.2010
comment
Не могли бы вы рассказать об этом подробнее? Каковы другие подводные камни, кроме специальных символов, таких как &, ‹, ›, и '. Это просто правильно вложенные теги? Что еще мне не хватает? - person wsanville; 14.06.2010
comment
@wsanville: все, что связано с [[CDATA]], Unicode, пространствами имен, схемами, инструкциями по обработке. - person Craig Trader; 14.06.2010
comment
@wsanville: <!-- did you know--this comment is invalid XML --> - person dtb; 14.06.2010

Еще один аргумент против использования конкатенации строк заключается в том, что иерархическая структура данных непонятна при чтении кода. Например, в примере @Sander с Linq-to-XML ясно, к какому родительскому элементу принадлежит элемент «продукт», к какому элементу применяется атрибут «название» и т. д.

person Todd Owen    schedule 14.06.2010

Как вы сказали, просто неудобно правильно строить XML с помощью конкатенации строк, особенно теперь, когда у вас есть XML linq, который позволяет просто построить график XML и получить правильные пространства имен и т. Д.

Очевидно, что контекст и то, как он используется, имеют значение, например, в примере ведения журнала string.Format может быть вполне приемлемым.

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

person Chris Chilvers    schedule 14.06.2010

Основная причина: СУХОЙ: не повторяйтесь.

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

person Carlos    schedule 14.06.2010

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

Затем я загружаю его с помощью дерева XMLReader. И если XML-файл не читается как действительный, я возвращаюсь, нахожу проблему в своих процедурах сохранения и исправляю ее. Но пока я не получу работающую систему сохранения/загрузки, я отказываюсь выполнять критически важную работу, пока не буду уверен, что мои инструменты надежны.

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

Потому что независимо от того, используете ли вы StringBuilder или XMLNodes для сохранения/чтения файла, если все это тарабарщина, никто не поймет, как это работает.

person Jeffrey Kern    schedule 14.06.2010
comment
неделя? Не знаю, что ты делаешь не так, но это неправильно. - person Robert Rossney; 14.06.2010

Возможно, этого никогда не произойдет, но что, если ваша среда когда-нибудь переключится на XML 2.0? Ваш объединенный строками XML может быть или не быть действительным в новой среде, но XDocument почти наверняка сделает все правильно.

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

person catfood    schedule 25.01.2012