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

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

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

Ответы [ 12 ]

9 голосов
/ 10 августа 2008

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

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

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

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

Некоторые рекомендовали прочитать

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

3 голосов
/ 24 августа 2008

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

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

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

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

Единственная разница в том, как разные API сообщают об этом.

2 голосов
/ 11 августа 2008

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

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

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

2 голосов
/ 10 августа 2008

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

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

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

1 голос
/ 20 августа 2008

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

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

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

1 голос
/ 11 августа 2008

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

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

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

1 голос
/ 10 августа 2008

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

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

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

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

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

0 голосов
/ 11 августа 2008

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

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

0 голосов
/ 11 августа 2008

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

0 голосов
/ 11 августа 2008

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

...