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

Я генерирую некоторые 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>

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

10.08.2008 18:20:38
12 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

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

9
10.08.2008 19:05:08

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

-1
10.08.2008 18:26:24

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

<Something>
    <Contains>
        <An>
            <Address>15 Sample St
Example Bay
Some Country</Address>
        </An>
    </Contains>
</Something>

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

2
10.08.2008 19:16:33

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

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

Если с тегами работают вручную, все равно будет чище, если вы спросите меня.

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

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

1
10.08.2008 18:43:21

Что вы действительно должны делать, так это конвертировать XML в формат, сохраняющий пробелы.

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

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

-1
10.08.2008 19:36:55

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

-1
10.08.2008 20:35:18

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

0
15.12.2015 19:49:00

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

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

-2
23.05.2017 11:53:53

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

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

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

3
10.08.2008 21:24:24

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

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

Неловкость наличия строкового тега идет с обычным XML и широко обсуждалась при ужасе кодирования. http://www.codinghorror.com/blog/archives/001139.html

1
11.08.2008 13:12:35

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

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

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

1
19.08.2008 21:49:34

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

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

точно так же, как

<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>

Разница лишь в том, как разные API сообщают об этом.

3
24.08.2008 14:40:11