Язык разметки — XML

Программирование Язык разметки — XML

Помечено: 

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 месяц, 3 нед. назад.

  • Автор
    Сообщения
  • #5229
    @admin

    XML — расширяемый язык разметки.

    Язык xml используется для представления данных. Расширяемость означает, что приложения использующие xml сами определяют набор элементов. Например, в Ant (сборщик проектов) корневым элементом является project, в файлах для отображения новостей — элемент rss, в проектных файлах среды разработки CodeBlocks — элемент CodeBlocks_project_file. Другими словами, просто одного xml файла недостаточно, нужно приложение, которое сможет правильно интерпретировать представленные в нем данные.

    В плане разбора xml файлов проблемы нет. На многих языках уже реализован стандартный интерфейс c объектной моделью xml документа.

    Сходство xml и html заключается в том, что они оба были разработаны на основе языка SGML. По отношению к html, xml более абстрактная вещь, а в плане синтаксиса более жесткая. Например, рекомендации к XHTML (разметка страниц по xml правилам) для браузеров — прекращение обработки при обнаружении ошибки. А в HTML — попытаться понять что хотел автор.

    Один из минусов xml — избыточность.

    Структура xml файла

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

    заголовок

    Необязательный заголовок определяет версию xml и, если нужно, кодировку.
    Для русско-язычных значение кодировки может быть Windows-1251 или KOI-8.

    <?xml version="1.0" encoding="UTF-8">
    Также можно указать что содержимое не зависит от внешних факторов, например от
    внешних xml сущностей.
    <?xml version="1.0" standalone="yes"?>
    и минимальном варианте <?xml version="1.0" ?>

    комментарий

    <!-- так задается комментарий -->

    тип документа

    Указание типа документа не обязательно, но его наличие будет означать
    валидность документа.

    Ниже приведен небольшой пример определения типа документа внутри документа.
    Здесь root_el задает имя корневого элемента.
    По необходимости в квадратных скобках можно уточнить какие элементы может
    содержать корневой элемент. В нашем примере root_el может
    содержать один элемент el1, и несколько элементов el2. Далее можно уточнить каждый
    элемент в отдельности. В нашем примере мы указали, что элемент el1 и el2 содержат данные.

    <!DOCTYPE root_el [
    <!ELEMENT root_el (el1,el2+)>
    <!ELEMENT el1 (#PCDATA)>
    <!ELEMENT el2 (#PCDATA)>
    ...
    ]>

    Описание документа можно вынести в отдельный файл, а в xml файле делать только ссылку на него
    (относительный или полный url).
    Приватные описания указываются после слова SYSTEM. Публичные (стандартизованные) указываются
    после PUBLIC. Файл с описанием обычно имеет расширение dtd.

    <!DOCTYPE root_el SYSTEM "mydocttype.dtd">
    
    <!-- описание типа документа для HTML 4.0 --> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
      "http://www.w3.org/TR/REC-html40/loose.dtd">
    

    Можно объединить оба варианта, при условии, что имена элементов во внешнем файле не совпадают
    с именами элементов определенных внутри документа.

    элементы

    Элементы определяются либо парными тегами, либо одиночным тегом.
    Тег это общее название для конструкций в угловых скобках. Например, ниже приведено два тега, один открывающий, другой закрывающий. В открывающем теге
    после угловой скобки идет имя элемента, в данном случае myel. В закрывающем теге, после угловой скобки идет символ /, а затем имя элемента:
    <myel> </myel>

    Текст между тегами называется данными или значением элемента.
    <myel> here my data </myel>

    Если текста нет, т.е. элемент пустой, то можно воспользоваться одиночным тегом.
    <myel />

    Дополнительную информацию об элементе можно указать с помощью атрибутов.
    Они указываются в открывающем теге после имени элемента как имя_атрибута=»значение».
    Атрибутов может быть несколько.

    <myel myattrib1="val1" myattrib2="val2"> 
      here my data 
    </myel>
    

    дерево элементов

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

    <root_el>
      <el1>...</el1>
      <el2>...</el2>
      <el1>
        <el3>...</el3>
      </el1> 
      
      <!--  ошибка неправильное вложение -->
      <el1> <el2>...</el1> </el2>
        
    <root_el>
    <!--  ошибка лишний текст -->
      lala

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

    xml сущности

    XML поддерживает сущности — определение символического имени для каких-либо данных. Определить сущность можно в типе документа
    <!ENTITY hello "Hello World">

    Далее сущность используется в документе по схеме &entityname;

    <myel>
       First project name every where is &hello; 
    </myel>

    Ниже приведены предопределенные сущности:

    • apos — одинарная кавычка (‘);
    • quot — двойная кавычка («);
    • amp — амперсанд (&);
    • lt — левая угловая скобка (<);
    • gt — правая угловая скобка (>).

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

    Пространства имен

    Сложные xml документы могут иметь вставки xml фрагментов различного назначения. И существует вероятность определения в этих фрагментов одинаковых имен элементов. Для избежания подобных конфликтов в xml используются пространства имен.

    Пространство имен определяется в том элементе, в котором оно будет использоваться.
    Либо можно вынести определения всех используемых пространств имен в корневой элемент.
    Имя пространства имен задается как атрибут с префиксом xlmns:. Значение должно быть
    уникальным во всем документе, обычно это некий url адрес. Далее, чтобы указать нахождение элемента в определенном пространстве имен, используйте имя того пространства имен в качестве префикса имени элемента. В этом случае, имя элемента без префикса называется локальным именем.

    <?xml version="1.0" encoding="utf-8"?>
    <!-- определение прастранства имен html -->
    <html:html xlmns:html="http://www.w3.org/TR/xhtml1/">
    <html:body>
    <html:h1>xhtml секция</html:h1>
    <html:p>Hello World</html:p>
    </html:body>
    
    <!-- определяем второе пространство имен - app2 -->
    <app2:body xlmns:app2="app2unicstring">
      <app2:appdata1>any data</app2:appdata1>
      <app2:appdata2>more any data</app2:appdata2>
    </app2:body>
    </html:html>

    Если некое пространство имен должно использоваться по умолчанию, то оно просто определяется как xlmns атрибут. Например, для xhtml документов:
    <html xmlns="http://www.w3.org/1999/xhtml">

    Обзор DOM3 XML

    Объектная модель документа (DOM) представляется как иерархия узлов,
    объектов с интерфейсом Node. Остальные интерфейсы являются расширением Node:

    • Document — документ в целом. В качестве дочерних узлов
      может иметь Element (макс. один), ProcessingInstruction, Comment, DocumentType (макс. один);
    • DocumentFragment — описывает кусок документа, по сути является облегченной версией Document.
      В качестве дочерних узлов может иметь Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference;
    • DocumentType — тип документа, не может иметь дочерних узлов;
    • EntityReference — ссылка на xml сущность. Вместо создания узлов этого типа xml процессор
      может полностью раскрыть все сущности при построении документа.
      В качестве дочерних узлов может иметь Element, ProcessingInstruction, Comment, Text, CDATASection,
      EntityReference;
    • Element — элемент xml документа.
      В качестве дочерних узлов может иметь Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference;
    • Attr — атрибут элемента. Хотя это расширение Node, DOM не считает подобные узлы частью своей иерархии. Для них свойства parentNode, previousSibling и nextSibling всегда равны null. Узлы Text, EntityReference могут быть дочерними для представления значения атрибута;
    • ProcessingInstruction — специфические инструкции обработки для xml процессора;
    • CharacterData — вспомогательный интерфейс для доступа к символьным данным документа. Является базовым для узлов Comment и Text;
    • Comment — содержимое комментария;
    • Text — текстовое содержимое Element или Attr;
    • CDATASection — CDATA секция;
    • Entity — xml сущность, не важно разобранная или нет xml процессором.
      В качестве дочерних узлов может иметь Element, ProcessingInstruction, Comment, Text,
      CDATASection, EntityReference;
    • Notation — объявленная нотация в DTD (в описании типа документа), только для чтения.

    Кроме этого есть дополнительные вспомогательные интерфейсы как NodeList.

    XPath

    XPath — средство поиска информации в xml документе, используемое различными
    xml технологиями. Например, XPath выражения могут использоваться в XSLT.

    Для построени XPath шаблонов используются следующие элементы:

    • name — ссылка на любой xml элемент с указанным именем;
    • / — определяет отношение родительский-дочерний двух элементов (например, el_p/el_c). Позиция, указываемая с корневого элемента, называется абсолютной, все прочие относительными;
    • // — определяет отношение родительский-потомок двух элементов (например, el_p//el_cс);
    • @ — определяет атрибут элемента (например, el@attr_name);
    • /.. — ссылка на родительский элемента (например, el_c/..);
    • * — ссылка на все дочерние элементы (например, el_p/*);
    • | — объединение двух XPath выражений;
    • [] — позволяет с помощью операций указать дополнительные условия
      для значений элементов или значений атрибутов. Внутри скобок можно применять следующие конструкции:

      • name — дочерний элемент текущего элемента;
      • . — текущий элемента;
      • @name — атрибут текущего элемента.

    Пусть имеет следующий xml документ, содержащий книги по жанрам.

    <books>
      <fantasy>
        <book author="Tolkien">
           <name>hobbit</name>
           <price>15</price>
        </book>     
      </fantasy>
    
      <detective>
        <book author="Doile">
           <name>Holms</name>
           <price>20</price>
        </book>   
        <book author="Kristy">
           <name>Puaro</name>
           <price>25</price>
        </book>
        <book author="Kristy">
           <name>Non Puaro</name>
           <price>50</price>
        </book>                          
      </detective>
    </books>
    

    Тогда XPath шаблоны могут выглядеть следующим образом:

    • books/* — отобрали жанры;
    • books/detective — отобрали детективные книги;
    • name/.. — отобрали все книги, так как name является дочерним элементом всех книг;
    • book[price>30] — отобрали книги дороже 30, т.е. «Кристи не Пуаро»;
    • book[@author="Tolkien"] — отобрали все книги Толкиена;

    SAX 2.0 (Simple API for XML)

    Когда мы не собираемся работать со структурой xml документа, добавлять и удалять элементы
    и т.п., построение дерева DOM объектов парсером излишне. На это тратиться время и память.

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

Для ответа в этой теме необходимо авторизоваться.