Использование других способов доступа к элементам

В рассмотренных примерах сценариев доступ к узлам Element в иерархической структуре осуществлялся с использованием свойств childNodes или firstChild узла. При этом происходил переход от одного узла к другому. Аналогичным образом вы можете применять свойства узла lastChild, previousSibling, nextSibling и parentNode (см. таблицу 9.2).

Примечание. Свойства childNodes, firstChild и lastChild дают возможность доступа только к дочерним узлам, которые не являются атрибутами, в то время как свойства previousSibling и nextSibling могут быть использованы для доступа к вершинному узлу любого типа.

Другим способом доступа к XML-элементам является использование свойства getElementsByTagName, которое позволяет извлечь все элементы, имеющие определенное имя типа (например, TITLE). Этот метод может использоваться для узла Document (см. таблицу 9.3), а также для узла Element (см. таблицу 9.6). Если вы обращаетесь к методу для узла Document, он возвращает набор узлов Element для всех элементов в документе, обладающих заданным именем типа. Например, следующий оператор позволяет получить группу узлов для всех элементов в документе, обладающих именем BOOK:

NodeList = Document.getElementsByTagName("BOOK");

Если вы обращаетесь к методу getElementsByTagName для узла Element, как в следующем примере, он возвращает набор узлов для всех соответствующих элементов, которые являются подчиненными для узла Element:

NodeList = Element.getElementsByTagName("AUTHOR");

Подсказка. Если в качестве параметра метода getElementsByTagName вы укажете «*», то метод вернет набор узлов для всех элементов (всех элементов в документе, если вы вызываете метод для объекта Document, и всех подчиненных элементов, если вы вызываете метод для объекта Element).

Таблица 9.6. Полезные методы, поддерживаемые узлами Element. Для узлов Element вы также можете применять общие свойства узлов, приведенные в таблице 9.2

Метод узла Element

Описание

Пример

getAttribute (имя-amp)

Возвращает значение атрибута элемента с заданным именем

AttValue = Bement.getAttribute ("InStock");

getAttributeNode (имя-amp)

Возвращает узел Arrtibute, представляющий атрибут элемента с заданным именем

Attribute = BementgetAttributeNode ("InStock");

getElementsBy TagName (имя-типа)

Возвращает набор NodeList узлов Element для всех подчиненных элементов элемента с заданным именем. Если указано «*», возвращает узлы для всех подчиненных элементов

AuthorBementCollection = Bement.getBementsByTagName ("AUTHOR");

Метод getElementsByTagName предоставляет узлы Element в виде группового объекта NodeList. Доступ к отдельным узлам осуществляется с помощью действий, описанных в разделе «Использование объекта NodeList» ранее в этой главе. Например, следующий код отображает (в окне предупреждения) текстовое содержимое всех узлов Element в объекте NodeList, возвращенное методом getElementsByTagName:

for (i=0; i < NodeUst.length; ++i) 

alert (NodeLJst(i).text);

HTML-страница из Листинга 9-5 демонстрирует использование метода getElementsByTagName для узла Document. (Копия этого листинга содержится на прилагаемом к книге CD-ROM в файле GetEleinents.htm.) Страница отображает поле ввода INPUT типа TEXT, которое дает вам возможность ввести имя элемента. Когда вы щелкаете мышью на кнопке Show Elements, вызывается функция ShowElements сценария, которая использует метод getElementsByTagName для узла Document, чтобы найти и отобразить XML-разметку для всех элементов в документе, которые носят введенное вами имя элемента (если они имеются). Заметим, что сценарий использует свойство xml каждого из узлов Element для отображения содержимого XML-разметки элемента. Страница изначально связана с документом Inventory.xml, хотя вы можете отредактировать фрагмент данных, чтобы отобразить элементы из другого XML-документа. На следующем рисунке показано как Internet Explorer 5 отобразит страницу после того, как вы ввели в поле ввода INPUT имя AUTHOR и щелкнули мышью на кнопке Show Elements.

gl9-4.jpg  

Листинг 9-5

GetElements.htm

<!-- Имя файла: GetElements.htm -->

<HTML>

<HEAD>

<TITLE>Element Finder</TITLE>

<SCRIPT LANGUAGE ="JavaScript">

function ShowElements()

{

/*проверка ввода пользователем названия элемента в поле

'Element name':*/

if (ElementName.value =="")

{

ResultDiv.innerText="<You must enter an element" +"name info 'Element name' box.>";

return;

/*создание списка элементов NodeList с именами, аналогичными введенному: */

Document = dsoXMLXMLDocument; 

NodeList =

Document.getElementsByTagName(ElementName.value);

/* запись XML указателя для каждого найденного элемента

в ResultHTML: */ 

ResultHTML =""; 

for (i=0; i < NodeList.length; ++i)

ResultHTML += NodeList(i).xml + "\n\n";

/* назначение сохраненных результатов в свойстве innerText

элемента DIV: */ 

if (ResultHTML =="")

ResultDiv.innerText = "<no matching elements found>"; 

else

ResultDiv.innerText = ResultHTML; } 

</SCRIPT>

</HEAD> 

<BODY>

<XML ID="dsoXML" SRC="lnventory.xml"></XML>

<H2>Find Elements by Element Name</H2>

Element name: <INPUTTYPE="TEXT' ID="ElementName">&nbsp

<BUTTON ONCUCK="ShowElements()">Show Elements</BUTTON>

<HR>

<DIVID=ResultDiv></DIV>

</BODY> 

</HTML>

 

Доступ и отображение значений атрибутов в ХМ L-доку менте

Атрибут, который содержится в XML-элементе, представляется дочерним узлом Attribute. Однако вы не сможете обратиться к дочернему узлу Attribute с использованием свойств childNodes, firstChild или lastChild, которые годятся для доступа к дочерним узлам других типов. Вместо этого вам потребуется воспользоваться свойством attributes узла Element.

Примечание. DOM использует узлы Attribute для представления не только атрибутов, но и нескольких типов других компонентов XML, которые состоят из пар имя-значение, а именно:

Возьмем в качестве примера XML-документ из Листинга 9-6. (Копия этого листинга содержится на прилагаемом к книге CD-ROM в файле Inventory Attributes.xml.)

Листинг 9-6

Inventory Attributes.xml

<?xmlversion="1.0"?>

<!-- Имя файла: Inventory Attributes.xml -->

<INVENTORY>

<BOOK Binding="mass market paperback" lnStock="yes"

Review="***">

<TITLE>The Adventures of Huckleberry Finn</TITLE>

<AUTHOR Born="1835">Mark Twain</AUTHOR>

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE> 

</BOOK> 

<BOOK Binding="hardcover" lnStock="no">

<TITLE>Leaves of Grass</TITLE>

<AUTHOR Born="1819">WaltWhitman</AUTHOR>

<PAGES>462</PAGES>

<PRICE>$7.75</PRICE> 

</BOOK> 

<BOOK Binding="mass market paperback" lnStock="yes"

Review="****">

<TlTLE>The Legend of Sleepy Нollow<\TITLE>

<AUTHOR>Washingtonlrving</AUTHOR>

<PAGES>98</PAGES>

<PRICE>$2.95</PRICE> 

</BOOK> 

</INVENTORY>

Элементы BOOK в этом документе имеют от двух до трех атрибутов. Следующее выражение в сценарии получает узел для первого элемента BOOK:

Document.documentElement.chikJNodes(O)

(В этих и последующих примерах в данном разделе предполагается, что Document содержит узел Document.)

Свойство attributes данного узла Element предоставляет набор NamedNodeMap узлов Attribute для всех атрибутов, принадлежащих первому элементу BOOK:

NamedNodeMap = Document.documentElement.chikJNodes(0).attributes

Групповой объект NamedNodeMap несколько отличается от группового объекта NodeList, предоставляемого свойством узла childNodes. В таблице 9.7 приведены свойство и несколько полезных методов, предоставляемых объектами NamedNodeMap.

Таблица 9.7. Свойство и некоторые полезные методы, предоставляемы групповым объектом NamedNodeMap. Свойство attributes узла предоставляет объект NamedNodeMap

Свойство NamedNodeMap

Описание

Пример

length

Количество узлов, содержащихся в наборе

AttributeCount = Element.attributes.length;

getNamedltem (имя-атр)

Возвращает узел, который носит заданное имя

Attribute = Bement.attributes.getNamedltem ("Binding");

item (индекс, отсчитываемый от нуля) (метод по умолчанию)

Возвращает узел в заданной индексом позиции {0 соответствует первому узлу)

SecondAttribute = Bement.attributes.item (1); или SecondAttribute = Bemenlattributes (1);

reset ()

Устанавливает внутренний указатель на позицию перед первым узлом в наборе, так что последующий вызов nextNode возвращает первый узел

Element.attributes. reset ();

nextNode ()

Возвращает следующий узел в наборе в соответствии со значением внутреннего указателя

Bement.attributes.reset (); FirstAttribute = Bement.attributes.nextNode ();

Вы можете воспользоваться свойством length объекта NamedNodeMap и установленным по умолчанию методом item, чтобы перемещаться внутри набора и извлекать отдельные узлы Attribute. Например, следующий фрагмент сценария отображает имя и значение каждого атрибута для первого элемента BOOK рассматриваемого документа:

NamedNodeMap = Document.documentElement.childNodes(0).attributes; 

for (i=0; KNamedNodeMap.length; ++i)

alert ("node name:" + NamedNodeMap(i).nodeName + "\n"

+ "node value:" + NamedNodeMap(i).nodeValue);

Каждая пара имя-значение отображается в окне сообщения-предупреждения. На рисунке на следующей странице показано, как оно выглядит.

gl9-6.jpg

Обратите внимание, что свойство nodeName узла Attribute содержит имя атрибута, в то время как свойство nodeValue содержит значение атрибута.

Примечание. В действительности узел Attribute имеет дочерний узел Text, который содержит значение атрибута. Однако этот узел практически не нужен, поскольку вы легко можете получить значение атрибута из свойства nodeValue узла Attribute. В связи с этим тип дочернего узла Text в этой главе не рассматривается.

Вы можете извлечь определенный узел Attribute из объекта NamedNodeMap, вызвав метод getNamedltem данного объекта. Например, следующий фрагмент кода сценария отображает значение атрибута Binding первого элемента BOOK в рассматриваемом документе:

NamedNodeMap = Document.documentElement.childNodes(0).attributes; 

alert (NamedNodeMap.getNamedltem("Binding").nodeValue);

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

gl9-7.jpg

Доступ к примитивам и нотациям XML

Вы используете объявление не разбираемого примитива для включения в XML-документ внешних данных. (Все не разбираемые примитивы являются общими внешними примитивами.) При использовании не разбираемого примитива вы назначаете его имя атрибуту типа ENTITY или ENTITIES, что ассоциирует файл внешнего примитива с определенным XML-элементом. XML-процессор не имеет доступа к файлу не разбираемого примитива. Он просто делает описание примитива и его нотацию доступными приложению, которое может получать и соответствующим образом использовать информацию.

В этом разделе вы познакомитесь с XML-документом и HTML-страницей, которые демонстрируют основные этапы в использовании DOM для извлечения из XML-документа информации о примитиве, а также нотации, описывающей формат примитива. Листинг 9-7 содержит пример XML-документа, а Листинг 9-8 содержит пример HTML-страницы. (Копии этих двух листингов вы можете найти на прилагаемом к книге CD-ROM в файлах inventory Entity.xml и Inventory Entity.htm.)

Листинг 9-7 

Inventory Entity.xml

<?xml version="1.0"?>

<!-- Имя файла: Inventory Entity.xml -->

<!DOCTYPE INVENTORY

[

<!NOTATION TXT SYSTEM "plain text file">

<!ENTITY revjiuck SYSTEM "Review of Huckleberry Finn.txt"

NDATATXT> 

<! ENTITY revjeaves SYSTEM "Review of Leaves of Grass.txt"

NDATATXT> 

<!ENTITY revjegend SYSTEM "Reviewof Sleepy Hollow.txt"

NDATATXT>

<!ELEMENT INVENTORY (BOOK)*>

<!ELEMENT BOOK (TITLE, AUTHOR, BINDING, PAGES, PRICE)>

<!ATTLJST BOOK Review ENTITY #IMPUED>

<!ELEMENT TITLE (#PCDATA)>

<!ELEMENT AUTHOR (#PCDATA)>

<!ELEMENT BINDING (#PCDATA)>

<!ELEMENT PAGES (#PCDATA)>

<!ELEMENT PRICE (#PCDATA)>

>

<INVENTORY>

<BOOK Review="rev_huck">

<TITLE>The Adventures of Huckleberry Finn</TITLE> 

<AUTHOR>Mark Twain</AUTHOR>

<BINDING>mass market paperback</BINDING>

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE> 

</BOOK> 

<BOOK Review="rev_leaves">

<TITLE>Leaves of Grass</TITLE>

<AUTHOR>Walt Whitman</AUTHOR>

<BINDING>hardcover</BINDING>

<PAGES>462</PAGES>

<PRICE>$7.75</PRICE> 

</BOOK> 

<BOOK Review="revjegend">

<TITLE>The Legend of Sleepy Hollow</TITLE>

<AUTHOR>Washington lrving</AUTHOR>

<BINDING>mass market paperback</BINDING>

<PAGES>98</PAGES>

<PRICE>$2.95</PRICE> 

</BOOK> 

</INVENTORY>

 

Листинг 9-8

Inventory Entlty.htm

<!-- Имя файла: lnventoryEntity.htm -->

<HTML>

<HEAD>

<TTTLE>Get Entity lnformation</TITLE>

<SCRIPTLANGUAGE="JavaScript" FOR="window" EVENT="ONLOAD"> 

Document = dsolnventory.XM [Document; 

Attribute =

Document.documentElement.chikJNodes(0).attributes(0); 

if (Attribute.dataType == "entity") 

DisplayText ="'" + Attribute. nodeName

+"' attribute has ENTITY type" + "\n"; 

DisplayText += "attribute value ="

+ Attribute.nodeValue + "\n"; 

Entity = 

Document.doctype.entities.getNamedltem(Attribute.nodeValue);

DisplayText += "entity file ="

+ Entity.attributes.getNamedltem("SYSTEM").nodeValue

+ "\n"; 

NotationName =

Entity.attributes.getNamedltem("NDATA").nodeValue; 

DisplayText += "entity notation =" + NotationName + "\n"; 

Notation =

Document.doctype.notations.getNamedltem(NotationName); 

DisplayText += "notation URI or description ="

+ Notation.attributes.getNamedltem("SYSTEM").nodeValue

+ "\n";

alert (DisplayText); 

location.href =

Entity.attributes.getNaraedltem("SYSTEM").nodeValue;

</SCRIPT>

</HEAD> 

<BODY>

<XML ID="dsolnventory" SRC="lnventory Entity.xml"></XML> 

</BODY> 

</HTML>

Каждый элемент BOOK в рассматриваемом примере XML-документа содержит атрибут типа ENTITY с именем Review, которому присваивается имя не разбираемого примитива, содержащего обзор для данной книги. Пример HTML-страницы включает сценарий, который демонстрирует основные действия, которые сценарий DOM должен выполнить, чтобы извлечь всю информацию о примитиве при обнаружении атрибута с типом ENTITY или ENTITIES. В частности, сценарий извлекает информацию о не разбираемом примитиве, назначенном атрибуту Review для первого элемента BOOK. Он отображает эту информацию в окне предупреждающего сообщения, как показано на следующем рисунке.

gl9-8.jpg

Вот краткое пояснение основных действий, выполняемых сценарием:

  1. Сценарий получает узел Attribute для атрибута Review первого элемента BOOK:

Attribute =

Document.documentElement.childNodes(0).attributes(0);

  1. Сценарий использует свойство dataType узла (см. таблицу 9.2), чтобы определить, имеет ли атрибут тип ENTITY:

if (Attribute.dataType == "entity")

{

/* получить информацию из примитива */

}

Сценарий выполняет остальные действия только в том случае, если атрибут имеет тип ENTITY. Т.е. эти действия, входящие в состав оператора if, выполняют только тогда, когда условие if истинно.

  1. Сценарий получает узел ENTITY для DTD-объявления примитива, присвоенного атрибуту:

Entity =

Document.doctype.entities.getNamedltem(Attribute.nodeValue);

Свойство doctype объекта Document (см. таблицу 9.3) предоставляет узел DocumentType, представляющий объявление типа документа. Свойство entities узла DocumentType предоставляет набор NamedNodeMap узлов Entity для всех объявлений примитивов в DTD. Узел Entity для конкретного примитива, присваиваемого атрибуту, получают заданием имени примитива (Attribute.nodeValue) в качестве параметра метода getNamedltem объекта NamedNodeMap (см. таблицу 9.7).

  1. Сценарий получает системный литерал примитива, который задает URI файла, содержащего данные примитива. Системный литерал хранится как значение узла Attribute с именем SYSTEM:

DisplayText += "entity file ="

+ Entity.attributes.getNamedltem("SYSTEM").nodeValue 

+ "\n";

  1. Сценарий получает имя нотации примитива, которое хранится как значение узла Attribute с именем NDATA:

NotationName =

Entity.attributes.getNamedltem("NDATA").nodeValue;

  1. Сценарий получает узел Notation для объявления нотации примитива:

Notation =

Document.doctype.notations.getNamedltem(NotationName);

Свойство notations узла DocumentType предоставляет набор NamedNodeMap узлов Notation для всех объявлений нотаций в DTD. Узел Notation для нотации примитива получают путем задания имени нотации (NotationName) в качестве параметра метода getNamedltem объекта NamedNodeMap.

  1. Сценарий получает системный литерал нотации, который содержит URI нотации или — в данном примере — ее описание. Системный литерал хранится как значение узла Attribute с именем SYSTEM:

DisplayText += "notation URI or description ="

+ Notation.attributes.getNamedltem("SYSTEM").nodeValue 

+ "\n";

  1. Сценарий отображает все хранимые результаты в окне предупреждающего сообщения:

alert (DisplayText);

  1. Сценарий завершается предоставлением Internet Explorer 5 возможности открыть и отобразить файл примитива, содержащего обзор. Он делает это путем присвоения URI файла (полученного на шаге 4) свойству location.href HTML-страницы, которое задает URL файла, отображаемого в данный момент браузером:

location. href =

Entity.attributes.getNamedltem("SYSTEM").nodeValue;

Свойство location.href является частью объектной модели DHTML, о которой вы можете узнать по адресу http:// msdn.microsoft.com/workshop/author/default.asp.

Перемещение внутри ХМ L-доку мента

В следующем упражнении вы создадите HTML-страницу, которая содержит сценарий для перемещения внутри XML-документа среди узлов в иерархии DOM, начиная с корневого элемента Document. Для каждого узла сценарий отображает имя узла, тип и значение. Сценарий задает отступ для каждого блока информации в узле, чтобы показать его уровень в иерархии. Вы можете использовать эту страницу, чтобы отобразить узлы для любого XML-документа и лучше узнать, как DOM структурирует узлы для различных типов XML-документов и компонентов документа.

Создайте страницу для перемещения между узлами

  1. Откройте новый, пустой текстовый файл в вашем текстовом редакторе и введите HTML-страницу, представленную в Листинге 9-9. (Копия этого листинга содержится на прилагаемом к книге CD-ROM в файле ShowNodes.htm.)
  2. Воспользуйтесь командой Save (Сохранить) вашего текстового редактора, чтобы сохранить документ на вашем жестком диске, присвоив ему имя файла ShowNodes.htm.

Листинг 9-9

ShowNodes.htm

<!-- Имя файла: ShowNodes.htm -->

<HTML>

<HEAD>

<TITLE>Show DOM Nodes<AITLE>

<SCRIPTLANGUAGE="JavaScript" FOR="window" EVENT="ONLOAD"> 

/* получить узел Document: */ 

Document = dsoXMLXMLDocument;

/* передача узла Document функции */ 

DisplayDIV.innerText = DisplayNodes(Document, 0);

function DisplayNodes (Node, IndentLevel)

{

/* объявить локальные переменные для рекурсии: */

vari;

var DisplayString ="";

/* создание отступа для данного уровня: */ 

Indent =""; IndentDelta =" "; 

for (i=0; i < IndentLevet; ++i) 

Indent += IndentDelta;

/* отображение свойств текущего узла: */ 

DisplayString += Indent + "nodeName:"

+ Node.nodeName 

+ "\n"

+ Indent 

+ "nodeTypeType:"

+ Node.nodeType 

+ "\n"

+ Indent 

+ "nodeTypeString:"

+ Node.nodeTypeString 

+ "\n"

+ Indent 

+ "nodeValue:"

+ Node.nodeValue 

+ "\n\n";

/* отображение атрибутов для каждого из дочерних узлов: */ 

Indent += IndentDelta; 

for (i=0; 

 Node.attributes != null 

&& i < Node.attributes.tength; 

++i) 

DisplayString += Indent + "nodeName:"

+ Node.attributes(i).nodeName + "\n" 

+ Indent + "nodeTypeType: " 

+ Node.attributes(i).nodeType + "\n" 

+ Indent + "nodeTypeString:" 

+ Node.attributes(i).nodeTypeString + "\n"

+ Indent + "nodeValue:" 

+ Node.attributes(i).nodeValue 

+ "\n\n";

/* отображение каждого из дочерних узлов, не являющихся

атрибутами: */ 

for (i=0; i < Node.childNodes.length; ++i)

DisplayString += 

DisplayNodes (Node.childNodes(i), IndentLevel + 1);___

/* возврат строки, содержащей результаты: */ 

return DisplayString;

</SCRIPT>

</HEAD>

<BODY>

<XML ID="dsoXML" SRO"lnventory Dom.xml"></XML> 

<H2>XML Document Object Model (DOM) Nodes</H2> 

<DIV ID="DisplayDIV"></DIV>

</BODY>

</HTML>

В начале сценарий передает узел Document функции DisplayNodes, которая возвращает отображаемую.информацию данного узла и всех его дочерних узлов. Сценарий присваивает отображаемую информацию свойству innerText элемента DisplayDIV DIV в разделе BODY страницы, который затем отображает эту информацию:

DisplayDIV.innerText = DisplayNodes(Document, 0);

Второй параметр функции DisplayNodes задает уровень отступа, используемого при отображении информации узла.

Функция DisplayNodes имеет следующую форму записи:

function DisplayNodes (Node, IndentLevel)

Функция выполняет следующие основные действия:

/* создание отступа для данного уровня: */ 

Indent =""; 

IndentDelta =" "; 

for (i=0; i < IndentLevel; ++i); 

Indent += IndentDelta;

/* отображение свойств текущего узла: */ 

DisplayString += Indent + "nodeName:" 

+ Node.nodeName + "\n" 

+ Indent + "nodeTypeType:" 

+ Node.nodeType + "\n" 

+ Indent + "nodeTypeString:" 

+ Node.nodeTypeString + "\n" 

+ Indent + "nodeValue:" 

+ Node.nodeValue + "\n\n";

Подсказка. Если вы хотите увидеть дополнительные свойства для каждого узла, то можете добавить их в представленный выше фрагмент кода. Вы можете использовать любые общие свойства узла, приведенные в таблице 9.2. Однако не следует использовать специальные свойства, характерные для определенного узла (они приведены в таблице 9.3 для узлов Document), поскольку они применимы не для всех типов узлов.

/* отображение атрибутов для каждого из дочерних узлов: */ 

Indent += IndentDelta; 

for(i=0;

Node.attributes != null 

&& i < Node.attributes.length; 

++i) 

DisplayString += Indent + "nodeName:"

+ Node.attributes(i).nodeName + "\n"

+ Indent + "nodeTypeType: "

+ Node.attributes(i).nodeType + "\n"

+ Indent + "nodeTypeString:"

+ Node.attributes(i).nodeTypeString

+ "\n"

+ Indent + "nodeValue:"

+ Node.attributes(i).nodeValue

+ "\n\n";

Примечание. Функция DisplayNodes не отображает дочерний узел Text узла Attribute, поскольку гораздо удобнее получить значение атрибута непосредственно из свойства nodeValue самого узла Attribute.

/* отображение каждого из дочерних узлов, не являющихся атрибутами: */ 

for (i=0; i < Node.childNodes.length; ++i) 

DisplayString += 

DisplayNodes (Node.childNodes(i), IndentLevel + 1);

/* возврат строки, содержащей результаты: */ 

return DisplayString;

  1. Откройте страницу в Internet Explorer 5.

Обратите внимание, что свойство nodeTypeString содержит тип узла в виде строчных букв. (Так, «Document» и «Processing-Instruction» превращаются в «document» и «processinginstruc-tion».)

Изначально страница отображает XML-документ Inventory Dom.xml (см. Листинг 9-1 и файл на CD-ROM). Первая часть отображаемых результатов выглядит, как показано на рисунке на следующей странице.

  1. Чтобы просмотреть структуру узлов для других XML-документов, отредактируйте фрагмент данных страницы. Например, чтобы просмотреть узлы документа Inventory Valid Entity .xml (см. Листинг 6-1 и файл на CD-ROM), вы должны изменить фрагмент данных следующим образом:

<XMLID="dsoXML" SRC="lnventory Valid Entity.xml"></XML>

Проверка валидности ХМL-документа

В последнем разделе данной главы приведена HTML-страница, которая открывает XML-документ и использует свойства DOM для выдачи сообщений относительно обнаруженных в нем ошибок. Если документ не имеет объявления типа документа, страница выдает сообщения только об ошибках корректности формы. Если же документ включает объявление типа документа, страница выдает сообщения как об ошибках корректности формы, так и об ошибках валидности. Вы можете использовать эту страницу для тестирования любого XML-документа.

Как использовать страницу проверки на валидность

  1. В вашем текстовом редакторе откройте страницу проверки на валидность Validity Test.htm. (Копия этого файла содержится на прилагаемом к книге CD-ROM и в Листинге 9-10 далее.)
  2. Отредактируйте фрагмент данных в разделе BODY страницы, чтобы атрибуту SRC было присвоено URL XML-документа, который вы хотите подвергнуть тестированию. Например, чтобы протестировать документ Raven.xml, вы должны отредактировать фрагмент данных следующим образом:

<XML ID="dsoTest" SRC="Raven.xmr></XML>

  1. Воспользуйтесь командой Save (Сохранить) вашего текстового редактора, чтобы сохранить модифицированную страницу.
  2. Откройте страницу в Internet Explorer 5. Страница отобразит окно сообщения, содержащее информацию о первой ошибке, обнаруженной XML-процессором Internet Expl