Поделиться через


Пробелы

В спецификации XML, опубликованной консорциумом World Wide Web (W3C), различные способы обозначения конца строки приведены к единому способу обозначения, однако при этом сохраняются все остальные пробелы, за исключением пробелов в значениях атрибутов. Кроме того, в XML предусмотрен набор средств, с помощью которых документы могут сообщать приложениям, следует ли сохранять пробелы.

Пробелы и XML-декларация

Согласно существующему стандарту XML 1.0 пробелы перед XML-декларацией не допускаются.

Если перед XML-декларацией есть пробелы, они будут рассматриваться как инструкция по обработке. Информация (в частности, о кодировке) не обязательно используется средством синтаксического анализа.

Дополнительные сведения об XML-декларациях см. в разделе XML-декларация.

Пробелы в содержимом элементов

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

<document>
<data>1</data>
<data>2</data>
<data>3</data>
</document>

и

<document><data>1</data><data>2</data><data>3</data></document>

и

<document><data>1</data> <data>2</data> <data>3</data></document>

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

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

Атрибут xml:space может принимать два значения.

  • default
    Это значение позволяет приложению обрабатывать пробелы при необходимости. Если не включить атрибут xml:space, то результат будет такой же, как при использовании значения default.
  • preserve
    Это значение показывает приложению, что пробелы следует сохранить в неизменном виде, так как они могут представлять важность.

Значения атрибутов xml:space применяются ко всем потомкам содержащего атрибут элемента, кроме случаев, когда значение переопределяется в одном из дочерних элементов.

Например, в следующих документах относительно пробелов задано одинаковое поведение:

и

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

Как и объявление языка, xml:lang, атрибут xml:space должен быть объявлен в определении типа документа (DTD), если он используется в среде, где выполняется проверка. Пространство имен xml объявлять не нужно, поскольку оно зарезервировано в спецификации языка XML.

По умолчанию службы Microsoft XML Core Services (MSXML) не обрабатывают атрибут xml:space. Если приложение должно учитывать атрибут xml:space, то перед синтаксическим анализом для свойства preserveWhiteSpace объекта DOMDocument следует задать значение True.

xmldoc= new ActiveXObject("Msxml2.DOMDocument.5.0");

xmldoc.preserveWhiteSpace = true;

xmldoc.load(url);

В службах MSXML также предусмотрены параметры, которые позволяют перепоручить обработку пробелов в приложении средству синтаксического анализа. Дополнительные сведения см. в разделе «Пробелы и модель DOM» в документации MSXML SDK.

ms256097.note(ru-ru,VS.100).gifПримечание
Сохранение информации о пробелах может существенно увеличить размер деревьев модели DOM из-за сохранения узлов пробелов между элементами.

Пробелы в атрибутах

Приложения по обработке XML сохраняют все пробелы в содержимом элементов, но часто нормализуют пробелы в значениях атрибутов. Символы табуляции, символы возврата каретки и пробелы обрабатываются как единичные пробелы. В определенных типах атрибутов удаляются пробелы, находящиеся до или после тела значения. Повторяющиеся пробелы внутри значения заменяются на один пробел. (При наличии определения DTD эта обработка проводится для всех атрибутов, не принадлежащих к типу CDATA).

Например, XML-документ может содержать следующие данные:

<whiteSpaceLoss note1="this is a note." note2="this
is
a
note.">

Средство синтаксического анализа XML передаст оба значения атрибута в виде "this is a note." с преобразованием разрывов строк в одиночные пробелы.

Примечание. В MSXML3 ни DOM, ни SAX не нормализует пробелов. В MSXML6 DOM не нормализует пробелов, а SAX нормализует.

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

Обработка конца строки

Средства синтаксического анализа XML обрабатывают сочетание символов возврата каретки и перевода строки (CRLF) как одиночные символы возврата каретки или перевода строки. Все они передаются как единичные символы перевода строки (LF). При сохранении документов приложения могут использовать соответствующие соглашения об обработке конца строки.