Я генерирую некоторые XML-документы, и когда дело доходит до адресной части, у меня есть фрагменты, которые выглядят следующим образом:
<Address>15 Sample St
Example Bay
Some Country</Address>
XSLT, который у меня есть для преобразования этого в XHTML, имеет какой-то забавный рекурсивный шаблон для преобразования символов новой строки в строках в
теги.
Все это прекрасно работает, но считается ли "плохой практикой" полагаться на символы перевода строки в XML-документах? Если да, то рекомендуется ли делать это вместо них?
<Address><Line>15 Sample St</Line>
<Line>Example Bay</Line>
<Line>Some Country</Line></Address>
Кажется, что было бы очень неудобно обводить тегами все места, где мой текст может состоять из нескольких строк...
It' s обычно рассматриваемая плохая практика, чтобы полагаться на linebreaks, с тех пор it' s хрупкий способ дифференцировать данные. В то время как большинство процессоров XML сохранит любой пробел, Вы вставляете свой XML, it' s не гарантируемый.
Настоящая проблема состоит в том, что большинство заявлений, которые производят Ваш XML в удобочитаемый формат, рассматривает весь пробел в interchangable XML, и могло бы разрушиться те linebreaks в одинарный интервал. That' s, почему Ваш XSLT должен подскочить через такие обручи, чтобы отдать данные правильно. Используя " br" признак значительно упростил бы преобразование.
Другая потенциальная проблема - это, если Вы открываете свой документ XML в XML-редакторе и симпатичное печатное издание она, you' ре, вероятно, чтобы потерять те разрывы линии.
Если Вы действительно продолжаете использовать linebreaks, удостоверьтесь, добавляет xml:space =" preserve" припишите " адрес " (Вы можете сделать это в своей ДАТЕ, если you' ре используя один.)
Некоторое предложенное чтение
приложения XML часто, кажется, берут a учтивое отношение к пробелу потому что правила о местах в документ XML, где пробел doesn' t вопрос иногда дают их прикладная свобода действий, чтобы добавить или удалите пробел в определенных местах.
Что относительно того, чтобы использовать признаки, чтобы хранить данные, а не текстовые узлы:
<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>
Я знаю, что использование признаков против текстовых узлов - часто обсуждаемый предмет, но I' ve продолжил работать с признаками 95% времени и haven' t испытал любые затруднения из-за него.
Немного людей сказали, что блоки CDATA позволят Вам сохранять разрывы линии. Это неправильно. Разделы CDATA только заставят повышение быть обработанным как данные о характере, они будут не обработка разрыва линии изменения.
<Address>15 Sample St
Example Bay
Some Country</Address>
точно то же как
<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>
Единственная разница - то, как различные API сообщают об этом.
Я думаю, что единственная реальная проблема заключается в том, что это делает XML более трудным для чтения. например.
<Something>
<Contains>
<An>
<Address>15 Sample St
Example Bay
Some Country</Address>
</An>
</Contains>
</Something>
Если красивый XML не является проблемой, я бы, вероятно, не беспокоился об этом, пока он работает. Если красивый XML вызывает беспокойство, я'бы преобразовал явные новые строки в теги <br />
или \n
перед вставкой их в XML.
Это зависит от того, как вы читаете и записываете XML.
Если XML генерируется автоматически - если новые строки или явные флаги \n разбираются в
- тогда беспокоиться не о чем. Ваш входной файл, скорее всего, не содержит никакого другого XML, поэтому лучше вообще не связываться с XML.
Если теги обрабатываются вручную, то, как по мне, лучше просто поставить перенос строки.
Исключение составляют случаи, когда вы используете DOM для получения некоторой структуры из XML. В этом случае переносы строк - явное зло, потому что они не представляют иерархию должным образом. Похоже, что для вашего приложения иерархия не имеет значения, поэтому переноса строк вполне достаточно.
Если XML просто выглядит плохо (особенно при автоматической генерации), может помочь Tidy, хотя он лучше работает с HTML, чем с XML.
У спекуляции XML есть что-то, чтобы сказать относительно пробела и linefeeds и переводы каретки в особенности. Таким образом, если Вы ограничиваете себя истинным linefeeds (x0A), Вы должны быть в порядке. Однако много инструментов редактирования переформатируют XML для " лучше presentation" и возможно избавьтесь от специального синтаксиса. Более прочный и более чистый подход, чем " < line> < / line> " идея состояла бы в том, чтобы просто использовать пространства имен и включить содержание XHTML, например:
<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>
Никакая потребность перестроить колесо когда дело доходит до стандартных словарей.
Это - вероятно, немного обманчивый пример, так как адрес немного не нормализован в этом случае. Это - разумный компромисс, однако так как адресные поля трудно нормализовать. Если Вы заставляете разрывы линии нести важную информацию, you' ненормализация ре и то, чтобы заставлять почтовое отделение интерпретировать значение разрыва линии.
Я сказал бы, что обычно это не большая проблема, но в этом случае я думаю, что признак Линии является самым правильным, так как он явно показывает что Вы don' t на самом деле интерпретируют то, что линии могут означать в различных культурах. (Помните, что у большинства форм для входа в адрес есть почтовый индекс и т.д. и линия адреса 1 и 2.)
Неловкость наличия признака линии идет с нормальным XML и была очень обсуждена при кодировании ужаса. http://www.codinghorror.com/blog/archives/001139.html
Я don' t видят what' s неправильно с '< Line>'; признаки.
По-видимому, визуализация данных важна для Вас, достаточно важна, чтобы держать их в Ваших данных (через линию, прерывает Ваш первый пример). Прекрасный. Тогда действительно держите его, don' t полагаются на " magic" держать его для Вас. Держите каждую часть данных you' ll нужно позже и can' t выводят отлично из спасенной части данных, держат его даже если it' s данные о визуализации (линия ломается и другое форматирование). Ваш пользователь (конечный пользователь другого разработчика) не торопился, чтобы отформатировать те данные к его симпатии - любой говорит ему (доктор API / текст около входа) что Вы don' t предназначают при хранении, это, или - просто держит его.
Да, я думаю, что использование блока CDATA защитит пробельные символы. Хотя некоторые API парсера позволяют сохранять пробельные символы.
Я рекомендую, чтобы Вы или добавили '< br/>'; разрывы линии или возможно используют предприятие разрыва линии - '& #x000D';
То, что Вы действительно должны делать, преобразовывает Ваш XML в формат, который сохраняет пробел.
Так, а не стремятся заменить \n & лейтенант; br/& gt; Вы должны обернуть целый блок в & лейтенант; pre& gt;
Тем путем Ваш адрес функционально сохранен (включаете ли Вы разрывы линии или не), и XSTL может выбрать, сохранить ли пробел в результате.
Если Вам нужен Ваш сохраненный linebreaks, используйте блок CDATA, как [tweakt сказал] (https://stackoverflow.com/questions/7277/is-it-bad-practice-to-be-sensitive-to-linebreaks-in-xml-documents#7280)
Иначе остерегайтесь. Большую часть времени linebreaks будет сохранен программным обеспечением XML, но иногда ими won' t, и Вы действительно don' t хотят полагаться на вещи, которые только работают по совпадению