Перспективные технологии и языки веб-разработки

Структура XML документа. Программный интерфейс XML DOM API

Показывать лекцию целиком

Теоретический материал

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

Ниже приведен пример XML документа:

<?xml version="1.0" encoding="Windows-1251"?>
<mail>
<to>user1@domain.ru</to>
<from>user2@domain.ru </from>
<subject>Встреча</heading>
<body>Позвони мне завтра утром</body>
</mail>
  • В первой строке помещена XML декларация, описывающая версию XML и используемую кодировку
  • В следующей строке описан корневой элемент документа.
  • В последующих четырех строках описаны 4 дочерних элемента относительно корневого: (to, from, subject и body).
  • И в последней строке указывается конец корневого элемента.
  • XML документ должен содержать корневой элемент, который является родительским для всех остальных элементов. Любой элемент (кроме находящихся на самом нижнем уровне дерева) может иметь вложенные элементы (дочерние элементы).

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

    Элементы могут иметь текстовое содержимое и атрибуты.

    Ниже приведена схема, показывающая отношения между элементами и атрибутами этого документа:

    Кроме того в XML документе следует выполнять еще несколько несложных правил:

  • Каждый XML элемент должен иметь закрывающий тэг.
  • XML тэги чувствительны к регистру.
  • Должны соблюдаться правила вложенности элементов.
  • XML документы должны иметь корневой элемент, который является родительским для всех других элементов.
  • Значения XML атрибутов должны заключаться в двойные кавычки.
  • Некоторые из символов (их всего 5) имеют специальное значение в XML. Для их обозначения используются альтернативные сочетания:

    замена символ
    lt; <
    gt; >
    amp;
    apos; '
    quot; "

    Комментарии в XML выделяются также как и в HTML:

    <!-- Это комментарий -->
    

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

    XML документы, оформленные в соответствии с приведенными выше правилами, называются "правильно оформленными". Если при этом они еще и соответствуют правилам DTD (Document Type Definition), то они являются и "действительными".

    Действительные XML документы содержат ссылку на DTD файл, например:

    <!DOCTYPE note SYSTEM "mail.dtd">
    

    DTD схема предназначена для определения структуры XML документа путем задания списка допустимых элементов, например

    <!DOCTYPE mail [
      <!ELEMENT note (to,from,subject,body)>
      <!ELEMENT to      (#PCDATA)>
      <!ELEMENT from    (#PCDATA)>
      <!ELEMENT subject (#PCDATA)>
      <!ELEMENT body    (#PCDATA)>
    ]>
    

    Консорциум W3C поддерживает альтернативную к DTD, основанную на XML схему, называемую как "XML Schema":

    <xs:element name="mail">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to"      type="xs:string"/>
        <xs:element name="from"    type="xs:string"/>
        <xs:element name="subject" type="xs:string"/>
        <xs:element name="body"    type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    </xs:element>
    

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

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

    Порядок выполнения лабораторной работы

  • Описание структуры XML-документа с помощью DTD-схемы.
  • Создание XML-документа timetable.xml. Содержимое документа приведено ниже.
    <?xml version="1.0"?>
    <timetable>
    <day dayOfWeek="Monday">
     <lesson type="practical">
          <timeFrom>08.00</timeFrom>
          <timeTo>09.30</timeTo>
          <subject>Deutsch</subject>
          <teacher>Borisova</teacher>
          <room>216</room>
        </lesson>
        <lesson type="lecture">
          <timeFrom>09.40</timeFrom>
          <timeTo>11.10</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Egorov</teacher>
          <room>384</room>
        </lesson>
        <lesson  type="practical">
          <timeFrom>11.20</timeFrom>
          <timeTo>12.50</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Petrov</teacher>
          <room>384</room>
        </lesson>
    </day>
    </timetable>
    

    Загрузите этот файл в браузере. Обратите внимание на иерархическую структуру документа.

  • Добавьте в начало файла внутреннюю DTD-схему:
    <?xml version="1.0"?>
    
    <!DOCTYPE timetable[
    <!ELEMENT timetable (day*)>
    <!ELEMENT day (lesson+)>
    <!ELEMENT lesson (timeFrom, timeTo, subject, teacher, room?)>
    <!ELEMENT timeFrom (#PCDATA)>
    <!ELEMENT timeTo (#PCDATA)>
    <!ELEMENT subject (#PCDATA)>
    <!ELEMENT teacher (#PCDATA)>
    <!ELEMENT room (#PCDATA)>
    <!ATTLIST day
    	dayOfWeek CDATA #REQUIRED>
    <!ATTLIST lesson
    	type CDATA #REQUIRED>
    ]>
    
  • Сохраните файл и проверьте его на правильность с помощью программы-валидатора, например, по адресу: http://validator.w3.org. Попробуйте удалить какой-либо элемент или атрибут, проверьте документ снова с помощью валидатора.
  • Вынесите схему во внешний файл с размещением на него ссылки внутри XML-документа. Проверьте, как будет загружаться XML-документ.
  • Описание структуры XML-документа с помощью XML Schema.
  • Создание XML-документа timetable2.xml. Содержимое документа приведено ниже.
    <?xml version="1.0"?>
    
    <timetable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="timetable.xsd">
    
    <day dayOfWeek="Monday">
     <lesson type="practical">
          <timeFrom>08.00</timeFrom>
          <timeTo>09.30</timeTo>
          <subject>Deutsch</subject>
          <teacher>Borisova</teacher>
          <room>216</room>
        </lesson>
        <lesson type="lecture">
          <timeFrom>09.40</timeFrom>
          <timeTo>11.10</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Egorov</teacher>
          <room>384</room>
        </lesson>
        <lesson  type="practical">
          <timeFrom>11.20</timeFrom>
          <timeTo>12.50</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Petrov</teacher>
          <room>384</room>
        </lesson>
    </day>
    </timetable>
    
  • Создание файла timetable.xsd, содержащего XML Schema:
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
    	<xs:element name = "timetable">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref = "day" minOccurs = "0" maxOccurs = "unbounded"/>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name = "day">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref = "lesson" maxOccurs = "unbounded"/>
    			</xs:sequence>
    			<xs:attribute name = "dayofWeek" use = "required" type = "xs:string"/>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name = "lesson">
    		<xs:complexType>
    			<xs:sequence>
    				<xs:element ref = "timeFrom"/>
    				<xs:element ref = "timeTo"/>
    				<xs:element ref = "subject"/>
    				<xs:element ref = "teacher"/>
    				<xs:element ref = "room" minOccurs = "0"/>
    			</xs:sequence>
    		</xs:complexType>
    	</xs:element>
    	<xs:element name = "timeFrom" type = "xs:string"/>
    	<xs:element name = "timeTo" type = "xs:string"/>
    	<xs:element name = "subject" type = "xs:string"/>
    	<xs:element name = "teacher" type = "xs:string"/>
    	<xs:element name = "room" type = "xs:string"/>
    
    </xs:schema>
    
  • Проверьте схему на правильность с помощью программы-валидатора, например, по адресу: http://www.w3.org/2001/03/webdata/xsv.
  • Загрузка и изменение дерева XML документа

    При выполнении данной лабораторной работы потребуется XML документ timetable.xml:

    <?xml version="1.0"?>
    <timetable>
    <day dayOfWeek="Monday">
     <lesson type="practical">
          <timeFrom>08.00</timeFrom>
          <timeTo>09.30</timeTo>
          <subject>Deutsch</subject>
          <teacher>Borisova</teacher>
          <room>216</room>
        </lesson>
        <lesson type="lecture">
          <timeFrom>09.40</timeFrom>
          <timeTo>11.10</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Egorov</teacher>
          <room>384</room>
        </lesson>
        <lesson  type="practical">
          <timeFrom>11.20</timeFrom>
          <timeTo>12.50</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Petrov</teacher>
          <room>384</room>
        </lesson>
    </day>
    </timetable>
    
  • Создание JavaScript сценария загрузки XML документа.

    Создайте текстовый файл loadxmldoc.js, содержащий описание функции загрузки XML документа:

    function loadXMLDoc(dname) 
    {
    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(dname);
      return(xmlDoc);
      }
    catch(e) {alert(e.message)}
    return(null);
    }
    

    и сохраните его в той же папке, где находится файл timetable.xml.

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

    <html>
    <head>
    <script type="text/javascript" src="loadxmldoc.js"> 
    </script>
    </head>
    
    <body>
    <script type="text/javascript">
    xmlDoc=loadXMLDoc("timetable.xml");
    document.write("xmlDoc is loaded, ready for use");
    </script>
    </body>
    </html>
    
  • Перемещение по дереву узлов.

    Подготовьте следующую HTML страницу:

    <html>
    <head>
    <script type="text/javascript" src="loadxmldoc.js"> 
    </script>
    </head>
    <body>
    <script type="text/javascript">
    xmlDoc = loadXMLDoc("timetable.xml");
    x = xmlDoc.getElementsByTagName("subject");
    for (i=0; i<x.length; i++)
      { 
      document.write(x[i].childNodes[0].nodeValue);
      document.write("<br />");
      }
    </script>
    </body>
    </html>
    

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

    Deutsch
    SAP Administration
    SAP Administration
    
  • Изменение значения элемента.

    Следующий пример демонстрирует изменение значения элемента <subject>:

    xmlDoc=loadXMLDoc("timetable.xml");
    x=xmlDoc.getElementsByTagName("subject")[0].childNodes[0];
    x.nodeValue="Java programming";
    
    x = xmlDoc.getElementsByTagName("subject");
    for (i=0; i<x.length; i++)
    { 
    document.write(x[i].childNodes[0].nodeValue);
    document.write("<br />");
    }
    

    Внесите соответствующие изменения в предыдущую страницу и загрузите ее в браузере.

  • Перемещение по узлам дерева с использованием отношений между ними.

    Следующий код показывает, как используя отношения firstChild и nextSibling можно получить для текущего узла список его дочерних узлов:

    x = xmlDoc.getElementsByTagName("lesson")[0].childNodes;
    y = xmlDoc.getElementsByTagName("lesson")[0].firstChild;
    
    for (i = 0; i < x.length; i++)
    {
    if (y.nodeType == 1)
      {
      document.write(y.nodeName + "<br />");
      }
    y=y.nextSibling;
    }
    

    Внесите необходимые изменения в html страницу и загрузите ее в браузере.

  • Реализация XSLT преобразования XML документа в XHTML средствами браузера.
  • Создайте файл ttable.xml следующего содержания:
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="ttable.xsl"?>
    <timetable>
        <lesson>
          <timeFrom>09.30</timeFrom>
          <timeTo>11.00</timeTo>
          <subject>Deutsch</subject>
          <teacher>Borisova</teacher>
        </lesson>
        <lesson>
          <timeFrom>11.10</timeFrom>
          <timeTo>12.20</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Petrov</teacher>
        </lesson>
        <lesson>
          <timeFrom>12.40</timeFrom>
          <timeTo>14.00</timeTo>
          <subject>SAP Administration</subject>
          <teacher>Ivanov</teacher>
        </lesson>
        <lesson>
          <timeFrom>14.00</timeFrom>
          <timeTo>15.20</timeTo>
          <subject>Wen-technology</subject>
          <teacher>Loktev</teacher>
        </lesson>
    </timetable>
    
  • Подготовьте для него соответствующий файл таблицы стилей (ttable.xsl):
    
    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
      <html>
      <body>
        <h2>My academical timetable</h2>
        <table border="1">
        <tr bgcolor="#a5abfa">
          <th align="left">Time From</th>
          <th align="left">Subject</th>
          <th align="left">Teacher</th>
        </tr>
        <xsl:for-each select="timetable/lesson">
        <tr>
          <td><xsl:value-of select="timeFrom"/></td>
          <td><xsl:value-of select="subject"/></td>
          <td><xsl:value-of select="teacher"/></td>
        </tr>
        </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>
    

    Первая строка в файле ttable.xml вида:

    <?xml-stylesheet type="text/xsl" href="ttable.xsl"?>
    

    представляет собой ссылку на подходящую таблицу стилей.

    В данном примере для описания шаблона был использован элемент <xsl:template>.

    Атрибут match применяется для связывания XML элемента с шаблоном. Значение атрибута match является выражение XPath. В данном случает match="/" указывает на весь документ.

    Содержимое элемента <xsl:template> описывает фрагмент HTML кода в выходном документе. Элемент <xsl:value-of> может быть использован для извлечения значения XML элемента и добавления его в выходной поток при преобразовании. Значение атрибута select является выражением XPath, которое напоминает нотацию, используемую в файловой системе; знак (/) указывает на обращение к подкаталогу.

    Элемент <xsl:for-each> позволяет выбирать каждый элемент XML указанного множества узлов.

  • При наличии подходящего браузера можно будет увидеть следующий результат после загрузке файла ttable.xml:

    Для фильтрации вывода элементов можно добавить атрибут элемента <xsl:for-each>, задающий критерий отбора элементов. Например:

    <xsl:for-each select="timetable/lesson[subject='SAP Administration']">
    

    Проверьте работу данного фильтра.

    Допустимо использование следующих операторов для описания фильтра:

  • = (равно)
  • != (не равно)
  • lt; (меньше чем)
  • gt; (больше чем)
  • Реализация преобразования с помощью JavaScript.
  • Подготовьте html файл, содержащий код:
    <html>
    <head>
    <script>
    function loadXMLDoc(fname)
    {
    var xmlDoc;
    // Код для IE
    if (window.ActiveXObject)
      {
      xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
      }
    // Код для Mozilla, Firefox, Opera и др.
    else if (document.implementation 
     document.implementation.createDocument)
      {
      xmlDoc=document.implementation.createDocument("","",null);
      }
    else
      {
      alert('Your browser cannot handle this script');
      }
    xmlDoc.async=false;
    xmlDoc.load(fname);
    return(xmlDoc);
    }
    
    function displayResult()
    {
    xml=loadXMLDoc("ttable.xml");
    xsl=loadXMLDoc("ttable.xsl");
    // Код для IE
    if (window.ActiveXObject)
      {
      ex=xml.transformNode(xsl);
      document.getElementById("example").innerHTML=ex;
      }
    // Код для Mozilla, Firefox, Opera и др.
    else if (document.implementation 
     document.implementation.createDocument)
      {
      xsltProcessor=new XSLTProcessor();
      xsltProcessor.importStylesheet(xsl);
      resultDocument = xsltProcessor.transformToFragment(xml,document);
      document.getElementById("example").appendChild(resultDocument);
      }
    }
    </script>
    </head>
    <body id="example" onLoad="displayResult()">
    </body>
    </html>
    

    Функция loadXMLDoc() загружает XML и XSL файлы в зависимости от типа браузера.

    Функция displayResult() используется для отображения XML файла в стиле, задаваемом XSL файлом. Она выполняет следующие действия:

  • загружает XML и XSL.
  • определяет тип браузера.
  • если браузер поддерживает ActiveX объекты:
  • с помощью метода transformNode() таблица стилей XSL применяется к XML документу.
  • формируется тело текущего документа.
  • если браузер клиента не поддерживает ActiveX объекты:
  • создается новый объект XSLTProcessor и в него импортируется XSL файл.
  • с помощью метода transformToFragment() таблица стилей XSL применяется к XML документу.
  • формируется тело текущего документа.
  • Загрузите этот документ в веб-браузере.
  • Реализация преобразования с помощью ASP
  • Подготовьте файл, содержащий следующий код сценария на языке ASP:
    <%
    'Load XML
    set xml = Server.CreateObject("Microsoft.XMLDOM")
    xml.async = false
    xml.load(Server.MapPath("ttable.xml"))
    
    'Load XSL
    set xsl = Server.CreateObject("Microsoft.XMLDOM")
    xsl.async = false
    xsl.load(Server.MapPath("ttable.xsl"))
    
    'Transform file
    Response.Write(xml.transformNode(xsl))
    %>
    

    В начале сценария создается экземпляр парсера Microsoft XML parser (XMLDOM), и XML файл загружается в память. Далее создается еще один экземпляр парсера, и XSL файл загружается в память. В последней строке выполняется собственно преобразование XML файла с использованием XSL файла в XHTML, который отправляется обратно браузеру.

  • Проверьте работу сценария в веб-браузере.
  • Контрольное задание

  • Разработка DTD и XML Schema для XML документа.

    В приведенном ниже XML документе описана экзаменационная ведомость:

    <gradeReport id="120851">
    <date>10-06-2008</date>
    <subject>Computer Science Fundamentals</subject>
    <examiner>prof.Litvinov</examiner>
       <gradeList>
    	<gradeRecord id="1">
    	   <student>Ivanov</student>
    	   <grade>4</grade>
    	</gradeRecord>
    	<gradeRecord id="2">
    	   <student>Petrov</student>
    	   <grade>3</grade>
    	</gradeRecord>
    	<gradeRecord id="3">
    	   <student>Sidorov</student>
    	   <grade>5</grade>
    	</gradeRecord>
       </gradeList>
    </gradeReport>
    

    Опишите структуру данного документа с помощью DTD схемы и XML Schema. Проверьте обе схемы с помощью соответствующих программ-валидаторов.

  • Манипулирование деревом XML документа

    В приведенном ниже XML документе описана экзаменационная ведомость:

    <gradeReport id="120851">
    <date>10-06-2008</date>
    <subject>Computer Science Fundamentals</subject>
    <examiner>prof.Litvinov</examiner>
       <gradeList>
    	<gradeRecord id="1">
    	   <student>Ivanov</student>
    	   <grade>4</grade>
    	</gradeRecord>
    	<gradeRecord id="2">
    	   <student>Petrov</student>
    	   <grade>3</grade>
    	</gradeRecord>
    	<gradeRecord id="3">
    	   <student>Sidorov</student>
    	   <grade>5</grade>
    	</gradeRecord>
       </gradeList>
    </gradeReport>
    
  • Используя методы DOM XML, сформируйте HTML страницу, содержащую таблицу из трех столбцов: номер, студент, оценка.
  • Используя методы DOM XML, замените цифровые значения оценок их словесными эквивалентами, например "4" на "good".
  • В приведенном ниже XML документе описана экзаменационная ведомость:
    <gradeReport id="120851">
    <date>10-06-2008</date>
    <subject>Computer Science Fundamentals</subject>
    <examiner>prof.Litvinov</examiner>
       <gradeList>
    	<gradeRecord id="1">
    	   <student>Ivanov</student>
    	   <grade>4</grade>
    	</gradeRecord>
    	<gradeRecord id="2">
    	   <student>Petrov</student>
    	   <grade>3</grade>
    	</gradeRecord>
    	<gradeRecord id="3">
    	   <student>Sidorov</student>
    	   <grade>5</grade>
    	</gradeRecord>
       </gradeList>
    </gradeReport>
    
    Постройте для него XSL файл, необходимый для XSLT преобразования исходного XML документа в HTML страницу, содержащую заголовок ведомости и таблицу оценок со столбцами: номер, студент, оценка.
  • Вернуться к учебному плану