Опубликован: 04.07.2012 | Уровень: специалист | Доступ: платный
Лекция 9:

Введение в XML. Структура XML документа. Объектная модель DOM XML

Ограничения на содержимое

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

Список возможных ограничений приводится ниже:

Ограничение Описание
enumeration Определяет список допустимых значений
fractionDigits Указывет максимальное число десятичных позиций. Должно быть неотрицательным
length Указывает точное число символов или элементов в списке. Должно быть неотрицательным
maxExclusive Указывает верхнюю границу числовых значений
maxInclusive Указывает верхнюю границу числовых значений
maxLength Указывает максимальное число символов или элементов в списке. Должно быть неотрицательным
minExclusive Указывает нижнюю невключаемую границу числовых значений
minInclusive Указывает нижнюю включаемую границу числовых значений
minLength Указывает минимальное число символов или элементов в списке. Должно быть неотрицательным
pattern Определяет точно последовательность символов (шаблон), которая допустима
totalDigits Определяет точное число цифр. Должно быть неотрицательным
whiteSpace Указывает как обрабатывать неотображаемые символы (пробел, табуляция и др.)

Примеры ограничения:

<xs:element name="age">
<xs:simpleType>
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="120"/>
  </xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="password">
<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-zA-Z0-9]{8}"/>
  </xs:restriction>
</xs:simpleType>
</xs:element>

Описание сложных элементов

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

Рассмотрим следующий пример:

<employee>
<firstname>John</firstname>
<lastname>Smith</lastname>
</employee>

Сложный элемент в схеме можно определить следующим образом:

<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>

<xs:element name="employee">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="firstname"/>
   <xs:element ref="lastname"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

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

  1. 1. Элемент "employee" element может быть объявлен непосредственно по имени:
    <xs:element name="employee">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="firstname" type="xs:string"/>
          <xs:element name="lastname" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    

    Поскольку дочерние элементы "firstname" и "lastname" окружены индикатором <sequence>, то они должны в документе появляться именно в этой последовательности.

  2. 2. Элемент "employee" может иметь атрибут типа, ссылающийся на имя сложного типа:
    <xs:element name="employee" type="personinfo"/>
    
    <xs:complexType name="personinfo">
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    

Несколько элементов могут ссылаться на тот же самый сложный тип:

<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

Также можно строить сложный элемент на базе существующего сложного элемента с добавлением нескольких элементов:

<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="fullpersoninfo">
  <xs:complexContent>
    <xs:extension base="personinfo">
      <xs:sequence>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="city" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

Пустой сложный элемент не может иметь содержимого, только атрибуты.

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

Всего используется семь индикаторов:

  • Индикатор порядка (Order):
    • All
    • Choice
    • Sequence
  • Индикатор вхождения (Occurrence):
    • maxOccurs
    • minOccurs
  • Групповые (Group) индикаторы:
    • Group name
    • attributeGroup name

Пример:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Валидаторы XML

Для проверки действительности XML документа можно использовать специальные валидаторы, например W3C валидатор (http://validator.w3.org/).

Для проверки схем также существуют специальные валидаторы, например XML Schema валидатор (http://www.w3.org/2001/03/webdata/xsv).

Следует отметить, что согласно спецификации W3C любая программа должна прекратить обработку XML документа, как только будет обнаружена ошибка в этом документе.

Структурный анализ (парсинг) XML

Все современные браузеры имеют встроенные XML анализаторы (парсеры) для чтения и обработки XML. Анализатор считывает XML документ, размещает его в памяти и преобразует в XML DOM объект, доступный для языков программирования. В данной лекции все примеры приведены на JavaScript.

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

Рассмотрим пример загрузки XML объектов (файлов и строк) с помощью XML анализатора Microsoft.

xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("timetable.xml");

В первой строке программы создается пустой объект XML документа Microsoft. Далее для предотвращения работы сценария до полной загрузки документа флаг асинхронности устанавливается в "false". В третьей строке содержится инструкция загрузить XML файл "timetable.xml".

В следующем примере происходит загрузка строки с XML кодом для последующего анализа.

xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);

Следует обратить на разницу между методами load() и loadXML() по их назначению.

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

Ниже приведены также кроссплатформенные реализации загрузки XML файла и XML строки соответственно.

<html>
  <body>
    <script type="text/javascript">
      try //Internet Explorer
        {
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        }
      catch(e)
        {
        try //Firefox, Mozilla, Opera, etc.
        {
        xmlDoc=document.implementation.createDocument("","",null);
        }
        catch(e) {alert(e.message)}
        }
      try 
        {
        xmlDoc.async=false;
        xmlDoc.load("timetable.xml");
        document.write("xmlDoc is loaded, ready for use");
        }
      catch(e) {alert(e.message)}
    </script>
  </body>
</html>
<html>
  <body>
    <script type="text/javascript">
      text="<timetable>";
      text=text+"<lesson>";
      text=text+"<timeFrom>08.00</timeFrom>";
      text=text+"<subject>Deutsch</subject>";
      text=text+"<teacher>Borisova</teacher>";
      text=text+"</lesson>";
      text=text+"/<timetable>";

      try //Internet Explorer
        {
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async="false";
        xmlDoc.loadXML(text);
        }
      catch(e)
        {
        try //Firefox, Mozilla, Opera, etc.
        {
        parser=new DOMParser();
        xmlDoc=parser.parseFromString(text,"text/xml");
        }
        catch(e) {alert(e.message)}
        }
      document.write("xmlDoc is loaded, ready for use");
    </script>
  </body>
</html>

Программный интерфейс XML DOM

В рамках DOM модели XML можно рассматривать как множество узловых объектов. Доступ к ним осуществляется с помощью JavaScript или других языков программирования. Программный интерфейс DOM включает в себя набор стандартных свойств и методов.

Свойства представляют некоторые сущности (например, <day>), а методы - действия над ними (например, добавить <lesson>).

В XML DOM используются практически те же свойства и методы, что и в HTML DOM.

Например, результатом выполнения следующего ниже JavaScript кода будет текстовой содержимое элемента <subject> в файле timetable.xml.

txt = xmlDoc.getElementsByTagName("subject")[0].childNodes[0].nodeValue;

Результат: "Deutsch".

В рамках DOM XML возможны 3 способа доступа к узлам:

  • С помощью метода getElementsByTagName(name). При этом возвращаются все узлы с указанным именем тэга (в виде индексированного списка). Первый элемент в списке имеет нулевой индекс.
  • Путем обхода узлов дерева с использованием циклических конструкций.
  • Путем перемещения по дереву с использованием отношений между узлами.

Для определения длины списка узлов используется свойство length.

Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам

 

Елена Кашникова
Елена Кашникова
Россия, братск