В приведенном ниже 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 DOM, которая определяет объекты и свойства всех XML элементов и методы (интерфейс) для доступа к ним. Иначе говоря, XML DOM описывает каким образом необходимо получать, изменять, добавлять и удалять XML элементы.
Согласно DOM:
- все, что содержится внутри XML документа, является узлом;
- весь документ представляется узлом документа;
- каждый XML элемент – узел элемента;
- текст внутри XML элементов - текстовый узел;
- каждый атрибут - узел атрибута;
- комментарии - узлы комментариев.
XML документ в соответствии с моделью XML DOM представляется как дерево из узлов, при этом:
|
|
- Все узлы дерева находятся в определенных отношениях друг с другом.
- Все узлы доступны через дерево. Их содержимое может быть изменено, удалено; новые элементы могут быть добавлены в дерево.
- Дерево начинается с корневого узла и разветвляется вниз вплоть до текстовых узлов на самом низшем уровне дерева.
- Все узлы находятся в иерархических отношениях между собой.
- Эти отношения описываются с помощью понятий родитель, дочерний и потомок (все дочерние на одном уровне).
Альтернативным интерфейсом для обработки XML документовявляется SAX.
SAX (Simple API for XML) - прикладной программный интерфейс для парсера с последовательным доступом к XML. Этот интерфейс предоставляет механизм чтения данных из XML документа.
SAX парсер является поточным и управляемым событиями. Задачей пользователя SAX API заключается в описании методов, вызываемых событиями, возникающими при анализе документа.
Такими событиями могут быть следующие:
- текстовый узел;
- узел элемента XML;
- инструкция обработки XML;
- комментарий XML.
События вызываются появлением как открывающего тэга, так и закрывающего тэга любого из этих элементов документа. Атрибут XML также рассматривается как событие.
Анализ документа является однонаправленным (т.е. без возвратов по дереву).
В отличие от DOM формальной спецификации для SAX не существует. В качестве нормативной рассматривается Java реализация SAX.
Следует отметить следующие достоинства и недостатки SAX.
|
|
Достоинства:
- Затраты памяти существенно меньше (зависит от максимальной глубины дерева документа и количества атрибутов в узле элемента), чем в случае DOM (требуется хранить в памяти все дерево документа).
- Скорость работы выше за счет сокращения затрат времени на выделение памяти для элементов дерева в случае DOM.
- Потоковое чтение данных с диска в случае DOM невозможно. Если для размещения всего документа в памяти недостаточно места, то использование SAX является безальтернативным.
Недостатки:
- Процедура проверки правильности предполагает доступ ко всему документу одновременно.
- Это также требуется и в случае XSLT преобразования.
Если загрузить "чистый" XML документ в веб-браузер, то можно будет увидеть древовидную структуру этого документа:
В этом как раз и заключается главное отличие между XML и HTML, а именно разделение структуры документа и его представления в браузере. Конкретный вид XML документа описывается отдельно с помощью CSS или XSL.
CSS и XSL — принципиально разные технологии, имеющие лишь частичное пресечение областей применения. CSS-форматирование применяется к HTML-документу браузером на клиентской стороне, а XSL-преобразование выполняется, как правило, на сервере, после чего результат отправляется браузеру клиента. XSL базируется на XML, благодаря чему XSL более гибок и универсален. У разработчиков имеется возможность использовать средства контроля за корректностью составления стилевых списков (используя схемы XML).
С помощью XSL можно преобразовать XML-документ в формат HTML, WML, RTF, PDF, SQL, SWF, а так же в другой XML и XSL документ. XSL указывает как будет оформлен документ, где и каким образом должны размещаться данные.
Cпецификация XSL состоит из трех частей:
- XSLT (XSL Transformations), язык для преобразования XML;
- XPath - язык путей и выражений, используемый в XSLT для доступа к отдельным частям XML-документа;
- XSL-FO (XSL Formatting Objects), язык для верстки XML.
Наиболее распространенным механизмом XSLT преобразований для систем работающих на платформе Microsoft Windows является MSXML; для систем на основе GNU — xsltproc.
Для того, чтобы обработать XML документ c помощью XSL, необходимо в XML документе написать следующую инструкцию:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="my-style.xsl"?>
<root>
<!--... -- >
</root>
Возвращаясь к рассмотренному ранее примеру, добавив в XML файл ссылку на XSL файл, получим следующий код разметки:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE mailbox SYSTEM "mailbox.dtd">
<?xml-stylesheet href="mailbox.xsl" type="text/xsl"?>
<mailbox>
<message uid='1'>
<body>Проверка почтового ящика</body>
<head>
<to>user2@myhp.edu</to>
<to>user3@myhp.edu</to>
<from>user1@myhp.edu</from>
<subject>Test</subject>
<cc></cc>
<notify></notify>
</head>
</message>
<message uid='2'>
<body>Это письмо не является спамом</body>
<head>
<to>user2@myhp.edu</to>
<from>user4@myhp.edu</from>
<subject>Интересное предложение</subject>
<notify></notify>
</head>
</message>
</mailbox>
После загрузки данного документа в веб-браузере его вид кардинально изменится:
Содержимое XSL файла mailbox.xsl приводится ниже:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "mailbox">
<h2 align="center" color="red">Почтовый ящик</h2>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match = "message">
<table align="center" border="0" width="80%" bgcolor="gray">
<tr>
<td width="20%"><b>From:</b></td>
<td>
<xsl:value-of select="head/from"/>
</td>
</tr>
<tr>
<td width="20%"> <b>To:</b> </td>
<td> <xsl:for-each select="head/to">
<xsl:apply-templates/>,
</xsl:for-each>
</td>
</tr>
<tr>
<td width="20%"><b>Subject:</b></td>
<td><xsl:value-of select="head/subject"/></td>
</tr>
<tr>
<td width="20%"><b>CC</b></td>
|
|
<td><xsl:value-of select="head/cc"/></td>
</tr>
<tr>
<td width="20%"><b>Notify</b></td>
<td><xsl:value-of select="head/notify"/></td>
</tr>
<tr>
<td colspan="2">
<textarea cols="120%" rows="3">
<xsl:value-of select="body"/>
</textarea>
</td>
</tr>
</table>
<br/><hr/><br/>
</xsl:template>
</xsl:stylesheet>