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

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

< Лекция 9 || Самостоятельная работа 5: 123 || Лекция 10 >

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

  1. Описание структуры XML-документа с помощью DTD-схемы.
    1. Создание 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>
      

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

    2. Добавьте в начало файла внутреннюю 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>
      ]>
      
    3. Сохраните файл и проверьте его на правильность с помощью программы-валидатора, например, по адресу: http://validator.w3.org. Попробуйте удалить какой-либо элемент или атрибут, проверьте документ снова с помощью валидатора.
    4. Вынесите схему во внешний файл с размещением на него ссылки внутри XML-документа. Проверьте, как будет загружаться XML-документ.
  2. Описание структуры XML-документа с помощью XML Schema.
    1. Создание 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>
      
    2. Создание файла 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>
      
    3. Проверьте схему на правильность с помощью программы-валидатора, например, по адресу: http://www.w3.org/2001/03/webdata/xsv.
  3. Загрузка и изменение дерева 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>
    
    1. Создание 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>
      
    2. Перемещение по дереву узлов.

      Подготовьте следующую 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
      
    3. Изменение значения элемента.

      Следующий пример демонстрирует изменение значения элемента <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 />");
      }
      

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

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

      Следующий код показывает, как используя отношения 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 страницу и загрузите ее в браузере.

  4. Реализация XSLT преобразования XML документа в XHTML средствами браузера.
    1. Создайте файл 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>
      
    2. Подготовьте для него соответствующий файл таблицы стилей (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 указанного множества узлов.

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

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

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

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

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

      • = (равно)
      • != (не равно)
      • &lt; (меньше чем)
      • &gt; (больше чем)
  5. Реализация преобразования с помощью JavaScript.
    1. Подготовьте 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 документу.
      • формируется тело текущего документа.
    2. Загрузите этот документ в веб-браузере.
    Реализация преобразования с помощью ASP
    1. Подготовьте файл, содержащий следующий код сценария на языке 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, который отправляется обратно браузеру.

    2. Проверьте работу сценария в веб-браузере.
< Лекция 9 || Самостоятельная работа 5: 123 || Лекция 10 >
Сергей Крупко
Сергей Крупко

Добрый день.

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

 

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

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

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