XML03 - Санкт-Петербургский государственный университет

advertisement
XML и XSLT
(3)
Матросов Александр Васильевич
Санкт-Петербургский
государственный университет
Действительный XML-документ
•
•
•
•
Документ считается действительным, если в его состав включено
определение DTD или XML-схема, а сам документ не противоречит
определению DTD или схеме
Определение DTD задает структуру XML-документа
Определение DTD объявляется посредством элемента <!DOCTYPE>
<!DOCTYPE rootname [DTD]>
<!DOCTYPE rootname SYSTEM URL>
<!DOCTYPE rootname SYSTEM URL [DTD]>
<!DOCTYPE rootname PUBLIC identifier URL>
<!DOCTYPE rootname PUBLIC identifier URL [DTD]>
Встроенное DTD
<?xml version="1.0" standalone="yes" encoding="UTF-8"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (GREETING, MESSAGE)>
<!ELEMENT GREETING (#PCDATA)>
<!ELEMENT MESSAGE (#PCDATA)>
]>
<DOCUMENT>
<GREETING>Hello From XML</GREETING>
<MESSAGE>Добро пожаловать в мир XML.</MESSAGE>
</DOCUMENT>
2
Проверка действительности на основе DTD
• Модули проверки действительности XMLдокументов доступны в Интернете
http://validator.w3.org/
• Использовать API и программные продукты
различных компаний
3
Проверка действительности на основе DTD
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Microsoft (msxml)
function loadXMLDoc(xmlFileName) {
xmlDoc = new ActiveXObject("MSXML.DomDocument");
xmlDoc.async = false;
xmlDoc.validateOnParse = true;
xmlDoc.load(xmlFileName);
if(xmlDoc.parseError.errorCode != 0){
var errorString = xmlDoc.parseError.srcText
errorString = xmlDoc.parseError.srcText.replace(/\</g, "<")
errorString = errorString.replace(/\>/g, ">")
document.getElementById("output").innerHTML = "Проблема в документе " +
xmlDoc.parseError.url +
", строка " + xmlDoc.parseError.line +
", позиция " + xmlDoc.parseError.linepos +
":<BR>Источник ошибки: " + errorString +
"<BR>Причина ошибки: " + xmlDoc.parseError.reason +
"<BR>" + "Ошибка: " +
xmlDoc.parseError.errorCode
}
else{
document.getElementById("output").innerHTML = "Ошибок в xml-документе нет!";
}
}
Задание: создать страницу HTML, на которой пользователь выбирает xml-документ и затем
он проверяется на правильность. Если неправилен, то ошибка, если правильный, то
отобразить его на этой же странице и в отдельном окне браузера
4
Объявления элементов (1)
• <!ELEMENT имя модель_содержимого>
• <!ELEMENT имя EMPTY> пустой элемент без
содержимого, но может иметь атрибуты
• <!ELEMENT имя ANY> любой тип содержимого
(любой элемент или символьные данные в любом
порядке – фактически содержимое элемента не
проверяется)
• <!ELEMENT имя (имя_дочернего_эл)> содержит
один дочерний элемент
• <!ELEMENT имя (#PCDATA)> содержит обычный
текст (разобранные символьные данные – parced
character data) (единственный способ указания
формата фактического символьного содержимого
элемента)
• Считается, что порядок объявления элементов не
имеет значения
5
Объявления элементов (2)
• Множественные дочерние элементы объявляются с
помощью синтаксиса регулярных выражений
a+ одно или больше появлений a
a* нуль или больше появлений a
a? одно или ни одного появлений a
a, b после a следует b
a | b a или b, но не оба сразу
(выражение) единый модуль и к нему можно
применять квантификаторы
• Смешанный тип
'(' S? '#PCDATA' (S? '|' S? Имя)* S? ')*'
| '(' S? '#PCDATA' S? ')'
можно задавать только имена дочерних элементов,
но не порядок их появления и количество
• Можно использовать комментарии
6
Внешние определения DTD
• DTD в файле вводится в документ для использования группой
лиц (закрытый идентификатор):
<!DOCTYPE rootname SYSTEM URL>
<!DOCTYPE rootname SYSTEM URL [DTD]>
• DTD для всеобщего использования:
<!DOCTYPE rootname PUBLIC identifier URL>
<!DOCTYPE rootname PUBLIC identifier URL [DTD]>
• Формальный открытый идентификатор (formal public identifier –
FPI) (// - разделитель полей идентификатора)
– Поле 1 – прошел ли стандартизацию («-» нет; «+» в данном случае
стандарт не применяется, но DTD одобрено; для официальных
стандартов имя этого стандарта, например, «ISO/IEC 13449:2000»
– Поле 2 – описывает имя группы или лица, которое поддерживает
или ответственно за это определение (уникальное имя)
– Поле 3 – указывает тип документа, обычно сопровождается
идентификатором версии
– Четвертое поле – используемый определением DTD язык
"-//starEditor//Custom XML Version 1.0//EN"
7
Объявления элементов: задания 1
•
•
Определить документы, у которых корневой элемент document содержит
item+, item*, item?, и создать XML-документы правильные и неправильные
в соответствии с разработанными определениями типа документов
Корневой элемент library:
1)
2)
3)
4)
library содержит элементы item (их может быть и пустое множество), каждый item
содержит один элемент title и один элемент author в указанном порядке,
элементы title и author содержат символьные данные
library содержит элементы name (ровно один), address (один, но может
отсутствовать), item (один есть всегда) в указанном порядке, каждый item содержит
один элемент title и несколько элементов author (один есть всегда) в указанном
порядке, элементы title, author, name и address содержат символьные данные
library содержит элементы name (ровно один), address (один, но может
отсутствовать), item (один есть всегда) в указанном порядке, каждый item содержит
один элемент title, несколько элементов author (один есть всегда) и либо udk
(ноль или один), либо bbk (ноль или один) в произвольном порядке, элементы title,
author, name, address, udk, и bbk содержат символьные данные
library содержит элементы name (ровно один), address (один, но может
отсутствовать), item (один есть всегда) в указанном порядке, каждый item содержит
один элемент title, несколько элементов author (один есть всегда) и либо udk
(ноль или один), либо bbk (ноль или один) в произвольном порядке, элемент title
содержит текст и элемент subtitle (смешанное содержимое), элементы author,
name, address, udk, bbk и subtitle содержат символьные данные
8
Объявления элементов: задания 2
• Задание: дано объявление типа документа
<!DOCTYPE BOOK [
<!ELEMENT p (#PCDATA)>
<!ELEMENT BOOK
(OPENER,SUBTITLE?,INTRODUCTION?,(SECTION | PART)+)>
<!ELEMENT OPENER (TITLE_TEXT)*>
<!ELEMENT TITLE_TEXT (#PCDATA)>
<!ELEMENT SUBTITLE (#PCDATA)>
<!ELEMENT INTRODUCTION (HEADER, p+)+>
<!ELEMENT PART (HEADER, CHAPTER+)>
<!ELEMENT SECTION (HEADER, p+)>
<!ELEMENT HEADER (#PCDATA)>
<!ELEMENT CHAPTER (CHAPTER_NUMBER,
CHAPTER_TEXT)>
<!ELEMENT CHAPTER_NUMBER (#PCDATA)>
<!ELEMENT CHAPTER_TEXT (p)+>
]>
Создать 2-3 правильных XML-документа и 2-3 неправильных
9
Объявления элементов: задания 3
•
Задания:
– Создать для номера 4 со слайда 8 внешнее DTD и
подключить его к документу
– В документе XML c внешним DTD (номер 4)
внутри документа изменить объявление title
как хранящее только символьные данные
– В документе XML c внешним DTD (номер 4)
убрать определение элемента title, а внутри
документа определить его как содержащего и
текст, и элемент subtitle с символьным
содержимым
10
Сущности (1)
•
•
Сущность можно определить как составляющий (физический) элемент
XML-документа
Сущности делятся на два типа: общие (используются внутри документа)
и параметрические (используются в DTD)
– Обращение в документе к сущности выполняется с помощью ссылок:
&имя_сущн; - ссылка на общую сущность
%имя_сущн; - ссылка на параметрическую сущность
– XML-процессор заменяет сущность ее содержимым (обычно текстовые
данные, но могут быть и в двоичной форме)
•
•
Сущности могут быть внешние (в определении обязателен URI) и
внутренние (полностью определяются в DTD)
Сущности делятся на разбираемые и неразбираемые
– Разбираемые заменяются на текст (внутренние – содержимое сущности
после подстановки символьных ссылок и ссылок на параметрические
сущности; внешние – содержимое сущности без подстановки символьных
ссылок и ссылок на параметрические сущности (они заменяются
непосредственно в документе), который может содержать маркировку
– Неразбираемые заменяются на их содержимое, которое может быть как
любым текстом (не обязательно XML), так и не текстом
•
Пять символьных сущностей предопредлены в XML (< > &
" ')
11
Общие сущности
•
•
•
•
•
Внутренние (всегда разбираемые)
<!ENTITY имя определение>
определение – строка, содержащая ссылки на другие общие или
параметрические сущности
<!ENTITY AUTHOR "S. Holzner">
<!ENTITY SIGNATURE "&AUTHOR; It's me">
Не допустимо зацикливание ссылок на сущности
Внешние (разбираемые)
<!ENTITY имя SYSTEM URI>
<!ENTITY имя PUBLIC FPI URI>
Файл должен иметь текстовое содержимое (возможно с разметкой) со
ссылками на общие или параметрические сущности, которые
разрешаются после подстановки в документ XML
Внешние сущности позволяют формировать документ на основе
отдельных частей
<!DOCTYPE library [
...
<!ENTITY data SYSTEM "../ch04.xml">
...
]>
<library>
&data;
</library>
12
Параметрические сущности
•
•
•
•
•
ОГРАНИЧЕНИЕ: можно определять параметрические сущности и использовать
ссылки на них только во внешних DTD
Внутренние
<!ENTITY % имя определение>
определение – строка, содержащая ссылки на другие параметрические
сущности, и которую можно использовать в DTD при определении содержимого в
объявлениях элементов, сущностей и атрибутов
<!ENTITY % content "title, name">
<!ELEMENT SIGNATURE (%content;, date)>
Внешние
<!ENTITY % имя SYSTEM URI>
<!ENTITY % имя PUBLIC FPI URI>
Используемая параметрическая сущность должна быть определена до ее
использования
Совместно с параметрическими сущностями используются директивы INCLUDE
и IGNORE
<![ INCLUDE [ ... ]]>
<![ IGNORE [ ... ]]>
<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >
<![%draft;[ <!ELEMENT book (comments*, title, body,
supplements?)> ]]>
<![%final;[ <!ELEMENT book (title, body, supplements?)> ]]>
13
Сущности: задания
1.
Создать внутреннюю общую сущность (с разметкой и без нее, со
ссылками на другие сущности и символьные ссылки) и использовать ее
–
–
–
–
–
2.
3.
4.
5.
6.
в определении другой внутренней сущности
в циклическом определении двух сущностей
в документе в качестве содержимого других элементов (с разметкой и без
разметки)
в секции CDATA (с разметкой и без разметки)
Использовать сущность в определении какого-либо элемента в DTD
Создать внутреннюю общую сущность, не удовлетворяющую
продукции content элемента XML и использовать ее в документе
Сделать задание 1, но с внешними общими сущностями
Создать параметрическую сущность во встроенном DTD и
использовать ее для определения элемента
Поработать с внутренними и внешними сущностями, определяя часто
используемые (или в последствии заменяемые) в определении других
элементов группы элементов
Просмотреть и проанализировать DTD для HTML и XHTML с точки
зрения использования параметрических сущностей
14
Атрибуты
•
•
Для каждого элемента можно объявить список атрибутов
<!ATTLIST имя_элемента
имя_атрибута тип умалчиваемое_поведение
имя_атрибута тип умалчиваемое_поведение
. . .
имя_атрибута тип умалчиваемое_поведение
>
Пример
<?xml version="1.0" standalone="yes" encoding="UTF-8"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (GREETING, MESSAGE)>
<!ELEMENT GREETING (#PCDATA)>
<!ELEMENT MESSAGE (#PCDATA)>
<!ATTLIST GREETING
lang CDATA #REQUIRED
type (text|audio|video) "text"
hand (UP | DOWN) #IMPLIED>
]>
<DOCUMENT>
<GREETING lang="en" hand="UP">Hello From XML</GREETING>
<MESSAGE>Добро пожаловать в мир XML.</MESSAGE>
</DOCUMENT>
15
Атрибуты: умалчиваемое поведение
• Умалчиваемое поведение
– значение (в соответствии с типом) атрибут определен
(указал его пользователь или нет) и имеет заданное
значение, пользователь может его изменить, умалчиваемого
значения нет
<!ATTLIST GREETING lang CDATA "en">
– #REQUIRED атрибут обязателен, его значение задает
пользователь, умалчиваемого значения нет
<!ATTLIST GREETING lang CDATA #REQUIRED>
– #IMPLIED атрибут не обязателен, а поэтому и нет значения
по умолчанию
<!ATTLIST GREETING lang CDATA #IMPLIED>
– #FIXED атрибут определен и всегда имеет указанное после
ключевого слова значение, пользователь не может его
изменить (попытка выполнить это приведет к тому, что
документ будет недействительным!)
<!ATTLIST GREETING lang CDATA #FIXED "en">
16
Атрибуты: типы (1)
• CDATA – строка символьных данных (можно использовать ссылки на
символьные и общие сущности (в значениях по умолчанию в DTD тоже))
<!ATTLIST GREETING lang CDATA "value &temp;">
• Перечисляемый тип не имеет ключевого слова, используется
выражение списка значений (value1 | value2 | ... | valueN)
<!ATTLIST GREETING lang (Yes | No) "No">
• NMTOKEN – лексема имени в XML (одна или больше букв, цифр,
символов дефиса, подчеркивания, точки, двоеточия, не обязательно
начинающаяся с буквы, подчеркивания или двоеточия, как простое имя)
<!ATTLIST GREETING lang NMTOKEN "1:_.">
• NMTOKENS – значения из нескольких лексем NMTOKEN, разделенных
пробельными символами
<!ATTLIST GREETING lang NMTOKENS "Alex Green">
• ID – атрибут с уникальным для всего документа значением
(соответствует имени в XML) среди атрибутов этого типа (элемент
может иметь ОДИН атрибут этого типа), назначается пользователем
(поэтому #IMPLIED или #REQUIRED)
<!ATTLIST GREETING lang ID #REQUIRED>
• IDREF – значение атрибута типа ID некоторого элемента этого же
документа (XML-процессор проверяет наличие в документе элемента с
указанным значением атрибута типа ID)
<!ATTLIST GREETING lang IDREF #REQUIRED>
17
Атрибуты: типы (2)
• ENTITY – значение имени объявленной внешней неразбираемой
сущности
<!ENTITY img1 SYSTEM "pict.gif" NDATA GIF>
<!NOTATION GIF SYSTEM "image/gif">
<!ATTLIST GREETING lang ENTITY "img1">
• ENTITIES – список имен объявленных внешних неразбираемых
сущностей
<!ENTITY img1 SYSTEM "pict1.gif" NDATA GIF>
<!ENTITY img2 SYSTEM "pict2.gif" NDATA GIF>
<!NOTATION GIF SYSTEM "image/gif">
<!ATTLIST GREETING lang ENTITY "img1 img2">
• NOTATION – перечисляемый тип, задающий список
объявленных в DTD нотаций формата представления данных
(MIME-типов), отличного от XML-кода
<!NOTATION GIF SYSTEM "image/gif">
<!NOTATION JPG SYSTEM "image/jpeg">
<!ATTLIST GREETING lang NOTATION (GIF | JPG) "GIF">
18
Внедрение данных отличного от XML формата
• Внешние неразбираемые общие сущности
<!ENTITY имя SYSTEM URI NDATA имя_нотации>
<!ENTITY имя PUBLIC FPI URI NDATA имя_нотации>
• Нотация задает имя формата данных неразбираемых внешних
сущностей
<!NOTATION имя SYSTEM MIME-тип>
• <!ENTITY img1 SYSTEM "pict.gif" NDATA GIF>
<!NOTATION GIF SYSTEM "image/gif">
• Двоичные данные включаются в XML-документ посредством
внешних неразбираемых сущностей через атрибуты
<!ATTLIST GREETING lang ENTITY "img1">
• XML-процессор не разбирает встраиваемую сущность, но часто
производит проверку наличия внешнего файла
19
Атрибуты: задания
• Создать атрибуты всех возможных типов для
элемента <GREETING>, подкорректировать
программу JavaScript из презентации
xml01.ppt для отображения атрибутов этого
элемента, и поприсваивать создаваемым
атрибутам правильные и неправильные
значения и посмотреть правильность
документа, а также значения атрибутов
• Отработать для себя методику включения в
XML-документ двоичного содержимого с
помощью неразбираемых внешних общих
сущностей через атрибуты элементов
20
Download