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

Некоторые моменты, такие как теги XML, мы уже частично рассматривали в предыдущей статье « ». Теперь мы еще раз затронем эту тему и разберем ее более подробно. Это сделано специально, чтобы вам было проще представить всю картину конструкций XML.

Элементы XML. Пустые и непустые элементы XML

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

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

Пустой элемент XML

Непустой элемент XML

Содержимое элемента...

Как мы видим с примера выше, главным отличием пустых элементов от непустых является то, что они состоят только из одного тега. Кроме того стоит также заметить, что в XML все имена регистрозависимые. Это означает, что имена myElement, MyElement, MYELEMENT и т.д. различаются между собой, поэтому данный момент стоит сразу запомнить, чтобы избежать ошибок в будущем.
Итак, с элементами мы разобрались. Теперь давайте перейдем к следующему моменту, такому как логическая организация XML-документов.

Логическая организация XML-документов. Древовидная структура XML данных

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

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

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

Атрибуты XML. Правила записи атрибутов в XML

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

В данном случае использовался атрибут с именем «attribute» и значением «value». Тут стоит сразу заметить, что атрибут XML обязательно должен содержать какое-то значение и не может быть пустым. В противном случае код будет некорректным с точки зрения XML.

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

Прежде чем приступить к рассмотрению других конструкций XML стоит также заметить, что при создании атрибутов в качестве значений не могут использоваться такие специальные символы, как амперсанд «&» или угловые скобки «<>». Данные символы зарезервированы в качестве управляющих («&» — сущность, а «<» и «>» открывают и закрывают тег элемента) и не могут быть использованы в «чистом виде». Для их использования нужно прибегать к замене спецсимволов.

Инструкции по обработке XML (процессинговые инструкции). XML-декларация

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

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

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

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

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

  • Encoding – отвечает за кодировку XML документа. Обычно используется кодировка UTF8.
  • Version – версия языка XML, на котором написан данный документ. Обычно это XML версии 1.0.

Ну а теперь перейдем к заключающей части статьи и рассмотрим такие конструкции XML как комментарии и секции CDATA.

Есть ли escape-символ для двойной кавычки в xml? Я хочу написать тег вроде:

но если я поставлю ", то это означает, что строка закончилась. Мне нужно что-то вроде этого (c ++):

Printf("Quote = \" ");

Есть ли символ, который нужно написать перед двойной цитатой, чтобы избежать его?

Новый, улучшенный ответ на старый, часто задаваемый вопрос...

Когда избежать двойной кавычки в XML

Двойная кавычка (") может появиться без выхода :

    В текстовом содержимом XML:

    He said, "Don"t quote me."

    В атрибутах XML, разделенных одинарными кавычками ("):

    Примечание: переход на одинарные кавычки (") также не требует экранирования:

Двойная кавычка (") должна быть экранирована :

    В атрибутах XML, разделенных двойными кавычками:

Нижняя линия

Двойная кавычка (") должна быть экранирована как« в XML »только в очень ограниченном контексте.

Если вам просто нужно быстро что-то попробовать, вот быстрое и грязное решение. Используйте одиночные кавычки для значения атрибута:

В C ++ вы можете использовать API-интерфейс EscapeXML ATL. Это правильный способ обработки специальных символов...

Вот общие символы, которые должны быть экранированы в XML, начиная с двойных кавычек:

  1. двойные кавычки (") сбрасываются в "
  2. амперсанд (&) ускользает до &
  3. одинарные кавычки (") сбрасываются в "
  4. меньше (<), экранируется до <
  5. больше, чем (>), экранируется до >

Другие ответили в том, как справиться с конкретным экранированием в этом случае.

Более широкий ответ - не пытаться сделать это самостоятельно. Используйте XML API - существует множество доступных практически для каждой современной платформы программирования.

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

С давних пор стандарт предписывает для вставки обычных кавычек в HTML -текст применять конструкцию " Ибо внутри тегов кавычки "" используются для обозначения атрибутов.

Однако, мне пока не попадался броузер, который бы не показал как кавычку простой символ " ВНЕ каких-либо тегов. Так скажите, уважаемые коллеги, может быть, применение " вне тегов есть попросту никому не нужное занудство? Можно спокойно и не мудрствуя писать "? Особенно в текстах, где кавычек много, а соблюдение строгих дизайнерских правил (насчет правильного употребления национальных кавычек) неактуально.

ИМХО, многие так и делают... но не совсем понятен вопрос: если вы понимаете, что по стандартам нужно кавычки писать как ", но лениво, притом что куча сайтов работает и так, то чего вы ожидаете услышать? Думаю, что о том, будет ли отображение кавычек поддерживаться в новых версиях броузеров, не знает никто, поэтому скороее всего можно дать очевидную рекомендацию: не хотите проблем в дальнейшем на 100% - держитесь стандартов:) Но это вы и так знаете. Или вы ждете подтверждения: да занудство это все, забей, и через 10 лет все будет так же, я(Microsoft,Mozilla и.т.д) гарантирую?

Lynn «Кофеман»[досье]
да, кстати... сейчас полез читать, нигде не утверждается что кавычки нужно представлять в виде "
http://www2.stack.ru/~julia/HTML401/charset.html :

Некоторые авторы используют ссылку на символьную сущность """ для кодирования экземпляров двойных кавычек ("), поскольку этот символ может использоваться для разделения значений атрибутов.

про то что, нужно использовать именно entity говорится только про <, > и &:

Если автор хочет поместить в текст символ "<", во избежание возможной путаницы с началом тега (метка начала тега) он должен использовать ссылку "<" (десятичный код ASCII 60). Точно так же во избежание проблем со старыми версиями пользовательских агентов, некорректно принимающих символы ">" за окончание тега (метка конца тега), следует использовать ссылку ">" (десятичный код ASCII 62).

Во избежание путаницы со ссылками на символы (метка начала ссылки на символ) вместо символа "&" следует использовать ссылку "&" (десятичный код ASCII 38). Кроме того, ссылку "&" следует использовать и в значениях атрибутов, поскольку ссылки на символы внутри значений атрибута CDATA разрешены.

А вот как раз и ожидаю что-то вроде ответа Lynn: что такого стандарта собственно нет. Мне это даже в голову не пришло - моя информация из популярных учебников и из соображений "все так делают".

Или другой вариант: а вот если следовать новым стандартам, с которыми я в своей практике не сталкивался - вроде xhtml (именно вроде, xhtml я проверил), то такой фокус не пройдет. Стало быть, не надо создавать проблем с переносимостью написанного HTML -кода.

Ну или наконец: вы-то сами как делаете?

&, кстати, порождает аналогичный вопрос. В приведенном выше документе говорится "во избежание путаницы". Но путаница возможна, только если за & следует один из предусмотренных кодов. А если это, скажем, URL типа "..../script?A=1&B=2" ? Рискую ли я чем-либо, если по ошибке в качестве href указал такой URL (который, разумеется, при тесте работает корректно)? Чем-либо кроме той крайне маловероятной ситуации, что лет через 10 (когда сайт устареет или будет уже десять раз переписан) появится сущность с экстравагантным именем &B без завершающей; ? Иными словами - насколько тщательно надо проверять все подобные случаи?

Даниил, если вы уверены что с существующими кодами у вас проблем не возникает - то вы можете писать и просто &. Если в дальнейшем и появится новый код - то он, думаю, будет объявлен явно не в спецификации HTML 4.01, следовательно на нормально объявленный документ влиять не должен. Или вы расчитываете обеспечить себе поддержку будущих стандартов путем простого изменения схемы документа?

Даниэль Алиевский[досье]
В XML обычная кавычка как текст тоже никакой проблемы не представляет (соответственно и в XHTML, конечно). IMHO кавычки обычно переводят в " лишь по одной причине — не хочется писать две функции для приведения текста к безопасному виду при подстановке в XML/ HTML /XHTML.

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

XML Атрибуты

В HTML атрибуты обеспечивают дополнительную информацию об элементах:

XML Атрибуты Должны Заключаться в Кавычки

Значения атрибутов в xml всегда должны быть заключены в кавычки. Могут использоваться как одинарные, так и двойные кавычки. Для указания пола элемента человек (person) можно написать так:

Если значение атрибута само по себе содержит двойные кавычки, вы можете использовать одинарные кавычки, как в этом примере:

XML Элементы против Атрибутов

Взгляните на следующие примеры:

Виктория
Петрова

female
Виктория
Петрова

В первом примере пол (sex) является атрибутом. В последнем, sex – это элемент. Оба примера предоставляют одну и ту же информацию.

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

Мой Любимый Способ

Следующие три XML документа содержат в точности одинаковую информацию:

XML атрибут date используется в первом примере:

Расширенный элемент date используется в третьем: (ЭТО МОЙ ЛЮБИМЫЙ СПОСОБ):



10
01
2008

Петя
Света
Напоминание

Избегать XML Атрибуты?

Некоторые из проблем с использованием xml атрибутов:

  • атрибуты не могут содержать несколько значений (элементы могут)
  • атрибуты не могут содержать древовидные структуры (элементы могут)
  • атрибуты сложнее расширить (для будущих изменений)

Не делайте подобным образом:

to="Вася" from="Света" heading="Напоминание"
body="Не забудь мне позвонить завтра!">

XML Атрибуты для Метаданных



Вася
Света
Напоминание
Не забудь мне позвонить завтра!


Света
Вася
Re: Напоминание
ОК

Атрибуты id выше используются для идентификации разных заметок. Они не являются частью заметки самой по себе.

Что я пытаюсь здесь сказать – метаданные (данные о данных) следует хранить как xml-атрибуты, а сами данные хранить как элементы.

Спасибо за внимание!.

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

Атрибуты предоставляют дополнительную информацию об элементе.

XML атрибуты

В HTML атрибуты предоставляют некоторую дополнительную информацию об элементе:

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

computer.gif

XML атрибуты должны заключаться в кавычки

Значение атрибута всегда должно заключаться в кавычки. Это могут быть либо двойные, либо одинарные кавычки. Например, пол персонажа можно записать так:

либо так:

Если значение атрибута само содержит двойные кавычки, то можно использовать одинарные кавычки. Например:

либо использовать символы сущностей:

XML элементы или атрибуты

Посмотрите на следующие примеры:

Пример №1

Anna Smith

Пример №2

female Anna Smith

В первом примере пол указан в атрибуте. Во втором, пол записан, как элемент. Оба примера предоставляют одну и ту же информацию.

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

Что лучше?

Следующие три XML документа содержат совершенно одинаковую информацию:

Дата записана, как атрибут :

Tove Jani Напоминание

Дата записана, как элемент :

10/01/2008 Tove Jani Напоминание Не забудь обо мне в эти выходные!

Дата записана, как расширенный элемент (На мой взгляд наилучший вариант):

10 01 2008 Tove Jani Напоминание Не забудь обо мне в эти выходные!

Избегать XML атрибуты?

При использовании атрибутов возникают некоторые проблемы:

  • атрибуты не могут содержать множественные значения (элементы могут)
  • атрибуты не могут содержать древовидные структуры (элементы могут)
  • атрибуты сложно расширять (для будущих изменений)

Никогда не используйте следующие конструкции:

XML атрибуты для метаданных

Иногда элементам присваивают идентификаторы. Эти идентификаторы используются для идентификации XML элементов в точности также, как идентификационные атрибуты в HTML. Следующий пример демонстрирует это:

Tove Jani Напоминание Не забудь обо мне в эти выходные! Jani Tove Re: Напоминание Не забуду

В приведенном примере атрибут id используется для идентификации разных заметок. Эта информация не является частью самой заметки.

Главная мысль всего сказанного это то, что метаданные (данные о данных) следует записывать, как атрибуты, а сами данные, как элементы.