Два ключевых термина XML
Не изучив эти два важных термина, нельзя «далеко уйти» в XML. Говорят, что XML-данные корректны (well-formed),
если они имеют верный XML-синтаксис и следуют правилам грамматики (соответствие тегов и т. д.). Часто проверка документа на корректность позволяет выявить опечатки в XML-файлах. Это уже преимущество, если данные, с которыми вы имеете дело, содержат конфигурационную информацию, как в случае с базой данных имеющихся машин, отрывок из
которой приведен выше.
Говорят, что XML-данные действительны (valid), если они удовлетворяют правилам, установленным одним из механизмов определения данных. Например, если ваши данные удовлетворяют DTD, то это действительные XML-данные.
Действительные данные по определению корректны, но обратное верно не всегда. Вполне могут существовать корректные данные без ассоциированной с ними DTD или схемы. Если такие данные верно анализируются, то они корректны, но не действительны.
Пережитки
Вот три термина, встречающиеся в литературе по XML, которые могут запутать новичка:
Attribute (атрибут)
Это описание элемента, являющееся частью открывающего тега.
Если воспользоваться предыдущим примером, то в <img src="picture.jpg" /> атрибутом будет src="picture. jpg". О том, когда применять содержимое элемента, а когда атрибуты, в мире XML ведутся споры. Самые лучшие указания именно по этой теме можно найти на http://www.oasis-open.org/cover/elementsAndAttrs.html.
СDАТА
Термин CDATA (Character Data, символьные данные) используется в двух смыслах. В первом он чаще всего относится ко всему в XML-документе, что не является разметкой (тегами и т. д.). А во втором подразумевает понятие разделов CDATA (sections). Объявление раздела CDATA указывает, что анализатор XML не должен рассматривать данный раздел, даже если он содержит текст, который может быть построен как разметка.
PCDATA
В аннотации Тима Брея к спецификации XML (упомянутой ранее) приводится следующее определение:
Строка PCDATA является сокращением от «Parsed Character Data». Это еще одно наследие SGML; «parsed» подразумевает, что процессор XML будет просматривать текст в поисках разметки, обозначаемой символами < и &.
Можно считать их данными, состоящими из CDATA и, вероятно, некоторой разметки. Большая часть XML-данных попадает под это определение.
В изучении XML имеются свои тонкости. Это маленькое руководство должно помочь вам приступить к работе.
XML - это язык разметки
Понятие «язык разметки» знакомо практически каждому благодаря повсеместному распространению HTML - старшего родственника XML. Как и HTML, язык XML состоит из обычного текста с вкраплениями специальных описательных вставок или инструкций. В HTML строго определено, какие части текста, называемые тегами, предназначены для разметки, тогда как в XML можно создавать свои собственные теги.
XML обеспечивает гораздо более широкий спектр выражений, чем HTML. Образец такого выражения был приведен в главе 3, но вот еще один простой пример, который должен быть понятен даже тем, кто никогда раньше не сталкивался с XML:
<machine>
<naiTie> quiooi
<departTierit Sofrwaa; Sorcery v'ceLareri:
<room> 129A < ooti>
<ownsr> Har Pottiv
<ipaddresr->
XML требователен Несмотря на гибкость
Вот два правила XML, которые заставляют спотыкаться тех, кто знаком с HTML:
1. Все, что начато, должно быть закончено. В приведенном выше примере список для машины начинался с <inachi nc>, а завершался с использованием </machine>. Без закрывающего тега это был бы пример XML, содержащий ошибку.
В HTML такие теги, как <img src="picture. ]pg">, вполне могут не иметь закрывающего тега. Но в XML это неверно, поэтому его нужно переписать либо так:
<img src="picture.jpg"> </img>
либо так:
<img src="picture.jpg" />
Слэш в конце последнего тега сообщает XML-анализатору, что он является одновременно и открывающим, и закрывающим тегом. Данные и окружающие их открывающий и закрывающий теги называются элементом (element).
2. Открывающие и закрывающие теги должны в точности соответствовать друг другу. Нельзя изменять их регистр. Если используется открывающий тег <MaChINe>, то закрывающим должен быть </MaChINo -, но не </МАСН> и не тег с любой другой комбинацией регистров. В этом отношении HTML гораздо более снисходителен.
Это два основных правила из спецификации XML. Но иногда автор определяет собственные правила, которым должен подчиняться анализатор XML. Под «подчиняться» следует подразумевать «выдавать предупреждения» или «останавливать анализ» при чтении XML-данных.
Если использовать в качестве примера предыдущее определение машины в базе данных, то можно ввести дополнительное правило: «Все элементы <nac:ine> должны содержать элементы <папе> и <ipaco'"bss--». Можно также ограничить содержимое элемента определенными значениями, подобными «YES» или «NO».
Эти правила определяются менее очевидным образом, чем все остальное, что будет рассмотрено, т. к. в настоящее время существует несколько конкурирующих и дополняющих друг друга предложений
для определения «языка». В конце концов, XML станет самоопределяемым (т. е. структуру документа будет описывать либо сам документ, либо нечто с ним связанное).
В текущей спецификации XML используется DTD (Document Type Definition, определение типа документа), основа SGML. Вот небольшой пример кода из спецификации XML, в котором определение типа находится в начале самого документа:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE greeting [
<!ELEMENT greeting (SPCDATA)>
]>
<greeting>Hello. world!</greeting>
В первой строке примера задается версия XML и применяемая кодировка для документа (в данном случае это Unicode). Следующие три строки определяют типы данных из этого документа. В последней строке приводится сам документ (элемент <greeting>).
При желании определить способ, с помощью которого подтверждалась бы правильность кода <machine> в первом примере из начала приложения, следовало бы добавить в начало файла нечто подобное:
<?xml version="1.О" encoding="UTF-8" ?> <!DOCTYPE machines [
<!ELEMENT machine (name,department, room,owner,ipaddress)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT department (#PCDATA)>
<!ELEMENT room (#PCDATA)>
<!ELEMENT owner (#PCDATA)>
<!ELEMENT ipaddress (#PCDATA)> ]>
Это определение требует, чтобы данные, соответствующие машине, состояли бы из элементов name, department, room, owner и ipaddress (именно в таком порядке). Каждый из этих элементов описывается как PCDATA (см. раздел «Пережитки» в конце данного приложения).
В другом популярном предложении, которое пока не является спецификацией, рекомендовано в DTD-подобных целях использовать описания данных под названием схемы (schemas). Сами схемы пишутся на XML. Вот пример кода схемы, использующей реализацию от Microsoft с http://www.w3.org/TR/1998/ NOTE-XML-data/:
<9XML version '1.0 ?> <schema id= 1Mac"i"eSchlea'
x'iHrs="i;r"r' schemtis-niicrcsof!
<!-определяем типы элементов (з;.:е они являются просто строками/PCDATA)
<strng/> </elementType> <elementType id="departnie'iT" .>
<str:ng/-' </'eleraentType> <elementType id="room">
<stnng/> </'elementType> <elenientType id="owner">
<string,/> </elementType> <elementType id="ipaddress">
<string/> </elementType>
<!-определяем сам элемент -->
<elementType id="Machine" content="CLOSED">
<element type="#name" occurs="REQUIRED"/>
<element type="#department" occurs="REQUIRED"/>
<element type="#room" occurs="REQUIRED"/>
<element type="»owner" occurs="REQUIRED"/>
<element type="#ipaddress" occurs="REQUIRED"/> </elementType> </schema>
Технология схем XML до сих пор (на момент написания книги) находится в стадии обсуждения. XML-данные, которые использовались в приведенном выше примере, являются всего лишь одним из предложений, рассматриваемым группой Working Group. Поскольку эта технология очень быстро развивается, я советую следить за текущими стандартами (их можно найти на http://www.w3.org) и за тем, насколько совместимо с ними ваше программное обеспечение.
Как и вполне зрелый механизм DTD, так и новый механизм схем очень быстро могут стать запутанными, поэтому оставим дальнейшие дискуссии книгам, посвященным XML/SGML.