Является ли “плохой практикой” быть чувствительным к разрывам строк в XML-документах?

StackOverflow https://stackoverflow.com/questions/7277

Вопрос

Я создаю несколько XML-документов, и когда дело доходит до адресной части, у меня есть фрагменты, которые выглядят следующим образом:

<Address>15 Sample St
Example Bay
Some Country</Address>

XSLT, который у меня есть для преобразования этого в XHTML, имеет какой-то забавный рекурсивный шаблон для преобразования символов новой строки в строках в <br /> Теги.

Все это работает нормально;но считается ли "плохой практикой" полагаться на разрывы строк в XML-документах?Если да, рекомендуется ли мне сделать это вместо этого?

<Address><Line>15 Sample St</Line>
<Line>Example Bay</Line>
<Line>Some Country</Line></Address>

Похоже, было бы действительно неудобно обертывать каждое место, где мой текст может состоять из нескольких строк, такими тегами..

Это было полезно?

Решение

Обычно считается плохой практикой полагаться на разрывы строк, поскольку это хрупкий способ разграничения данных.Хотя большинство XML-процессоров сохранят все пробелы, которые вы добавите в свой XML, это не гарантировано.

Реальная проблема заключается в том, что большинство приложений, которые выводят ваш XML-файл в удобочитаемый формат, считают все пробелы в XML взаимозаменяемыми и могут свести эти разрывы строк в один пробел.Вот почему ваш XSLT должен проходить через такие препятствия, чтобы правильно отображать данные.Использование тега "br" значительно упростило бы преобразование.

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

Если вы продолжаете использовать переводы строк, обязательно добавьте атрибут xml: space="сохранить" в "адрес". (Вы можете сделать это в своем DTD, если вы его используете.)

Некоторые предлагали почитать

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

Другие советы

Мало кто говорил, что блоки 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>

Если pretty XML не вызывает беспокойства, я бы, вероятно, не стал беспокоиться об этом, пока он работает.Если вас беспокоит красивый XML, я бы преобразовал явные новые строки в <br /> теги или \n прежде чем встраивать их в XML.

Как насчет использования атрибутов для хранения данных, а не текстовых узлов:

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>

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

Это зависит от того, как вы читаете и записываете XML.

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

Если с тегами работают вручную, то, по-моему, все равно чище просто использовать разрыв строки.

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

Если XML просто выглядит плохо (особенно при автоматическом создании), Аккуратный может помочь, хотя это лучше работает с HTML, чем с XML.

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

Я бы сказал, что обычно это не является большой проблемой, но в данном случае я думаю, что тег Line является наиболее правильным, поскольку он явно показывает, что вы на самом деле не интерпретируете, что могут означать строки в разных культурах.(Помните, что в большинстве форм для ввода адреса есть почтовый индекс и т.д., а также адресные строки 1 и 2.)

Неудобство использования тега line связано с обычным XML-файлом, и его много обсуждали в coding horror. http://www.codinghorror.com/blog/archives/001139.html

В спецификации XML есть что сказать относительно пробел и переводы строк и возвраты каретки, в частности.Так что, если вы ограничите себя истинными переводами строк (x0A), у вас все должно быть в порядке.Однако многие инструменты редактирования переформатируют XML для "лучшего представления" и, возможно, избавятся от специального синтаксиса.Более надежный и чистый подход , чем "< линия>< / строка>" идея состояла бы в том, чтобы просто использовать пространства имен и встраивать содержимое XHTML, например:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>

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

Я не понимаю, что в этом плохого <Line> Теги.
Очевидно, визуализация данных важна для вас, достаточно важна, чтобы сохранить ее в ваших данных (через разрывы строк в вашем первом примере).Прекрасно.Тогда действительно сохраните это, не полагайтесь на "магию", которая сохранит это для вас.Сохраните каждый бит данных, который вам понадобится позже, и вы не сможете точно вывести сохраненную часть данных, сохраните ее, даже если это данные визуализации (разрывы строк и другое форматирование).Ваш пользователь (конечный пользователь другого разработчика) потратил время на форматирование этих данных по своему вкусу - либо скажите ему (API doc / text рядом с вводом), что вы не намерены их сохранять, либо - просто сохраните их.

Да, я думаю, что использование CDATA блок защитил бы пробел.Хотя некоторые API-интерфейсы синтаксического анализа позволяют вам сохранять пробелы.

Что вам действительно следует сделать, так это преобразовать ваш XML-файл в формат, который сохраняет пробелы.

Поэтому вместо того, чтобы пытаться заменить на <br /> , вы должны обернуть весь блок в <pre>

Таким образом, ваш адрес функционально сохраняется (независимо от того, включаете вы разрывы строк или нет), и XSTL может выбрать, следует ли сохранять пробелы в результате.

Я рекомендую вам либо добавить <br/> разрывы строк или, может быть, использовать объект разрыва строки - &#x000D;

Если вам нужно сохранить ваши разрывы строк, используйте блок CDATA, как твикт сказал

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top