Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 016.doc
Скачиваний:
22
Добавлен:
07.02.2015
Размер:
79.36 Кб
Скачать

If Not nodeNode.Attributes Is Nothing Then

For Each nodeChild In nodeNode.attributes

ParseNode nodeChild, numLevel+1

Next

End If

'Выводим рекурсивно дочерние узлы, если они есть

If nodeNode.childNodes.length > 0 Then

For Each nodeChild In nodeNode.childNodes

ParseNode nodeChild, numLevel+1

Next

End If

End Function

Поиск и отбор узлов

Перечень методов:

Описание

selectNodes(patternString)

Возвращает коллекцию XMLDOMNodeList, содержащую поддерево, выбранное по шаблону поиска patternString.

selectSingleNode(patternString)

Аналогичен методу selectNodes, но возвращает только первый узел из выбранного поддерева.

В качестве параметра вышеуказанные методы принимают строку XSL-запроса (образец поиска - XSL pattern). Язык XSL-запросов напоминает способ определения пути в файловой системе - это список узлов, разделённых символом "/". Для указания на текущий элемент используется символ ".", на родительский - "..", для указания на все дочерние элементы - символ "*", для указания на элемент, расположенный ниже по дереву (не важно, на каком уровне вложенности) - символы "//". Условия в запросе заключаются в квадратные скобки "[" и "]". Имена атрибутов в запросе должны предваряться символом "@".

Вот примеры простейших запросов к образцовому XML-документу, расположенному в начале статьи:

"/PRODUCTS" - корневой элемент.

"//PRODUCT" или "/PRODUCTS/PRODUCT" - все элементы PRODUCT.

"//PRODUCT[@import]" - все элементы PRODUCT, в которых определён атрибут import.

"//PRODUCT[@import='yes']" - все элементы PRODUCT, у которых атрибут import равен "yes".

"//PRODUCT[SORT]" - все элементы PRODUCT, которые содержат хотя бы один элемент SORT.

"//SORT[COLOR or PRICE]" - все элементы SORT, которые содержат элементы COLOR или PRICE.

Выберем из образцового XML-документа и отобразим наименования отечественных товаров, у которых есть сорт серого цвета, а также всех импортных товаров:

Set xmlParser = CreateObject("Msxml2.DOMDocument")

xmlParser.async = False

xmlParser.load "C:\Sample.xml"

'Выбираем заголовки (элементы TITLE) тех товаров,

'которые отвечают заданным условиям

Set colNodes = _

xmlParser.selectNodes("//PRODUCT[(@import='no' and SORT/COLOR = 'gray')" & _

" or (@import='yes')]/TITLE")

'Перебираем полученную выборку

For Each nodeNode In colNodes

WScript.Echo nodeNode.text

Next

Вот запрос, составленный по-другому, но возвращающий те же результаты:

Set xmlParser = CreateObject("Msxml2.DOMDocument")

xmlParser.async = False

xmlParser.load "C:\Sample.xml"

'Выбираем заголовки (элементы TITLE) тех товаров,

'которые отвечают заданным условиям

Set colNodes = _

xmlParser.selectNodes("//TITLE[(../@import='no' and ../SORT/COLOR='gray')" & _

" or (../@import='yes')]")

'Перебираем полученную выборку

For Each nodeNode In colNodes

WScript.Echo nodeNode.text

Next

Ещё один способ выборки, с использованием метода selectSingleNode:

Set xmlParser = CreateObject("Msxml2.DOMDocument")

xmlParser.async = False

xmlParser.load "C:\Sample.xml"

'Выбираем товары, которые отвечают заданным условиям

Set colNodes = _

xmlParser.selectNodes("//PRODUCT[(@import='no' and SORT/COLOR = 'gray')" & _

" or (@import='yes')]")

'Перебираем полученную выборку

For Each nodeNode In colNodes

Set nodeTitle = nodeNode.selectSingleNode("TITLE")

WScript.Echo nodeTitle.text

Next

Создание, модификация и запись XML-документов

Перечень методов:

Описание

save(objTarget)

Сохраняет документ в файле (если указан URL) или замещает содержимое другого документа (если указан объект XMLDOMDocument).

createElement(tagName)

Создаёт и возвращает элемент с указанным именем.

createAttribute(name)

Создаёт и возвращает новый атрибут с указанным именем.

createCDATASection(strData)

Создаёт и возвращает новый узел CDATA, содержащий переданное значение.

createProcessingInstruction(strTarget, strData)

Создаёт и возвращает новый узел инструкции по обработке.

createComment(strComment)

Создаёт и возвращает новый узел комментария.

createEntityReference(strName)

Создаёт и возвращает новый узел ссылки на примитив.

createTextNode(strText)

Создаёт и возвращает новый текстовый узел.

createNode(numType, strName, strNamespaceURI)

Универсальный метод - создаёт и возвращает новый узел указанного типа и названия. Позволяет использовать пространства имён.

createDocumentFragment()

Создаёт и возвращает новый пустой фрагмент XML-документа, который в дальнейшем можно "наполнить" узлами и присоединить к XML-документу.

cloneNode(boolDeep)

Создаёт и возвращает копию текущего узла. Параметр boolDeep определяет, нужно ли рекурсивно копировать дочерние элементы.

setAttribute(name, value)

Устанавливает значение указанного атрибута текущего узла. При необходимости создаёт атрибут.

setAttributeNode(AttributeNode)

Устанавливает или обновляет переданный атрибут у текущего элемента.

removeAttribute(name)

Удаляет указанный атрибут. Если указанный атрибут имеет значение по умолчанию, вместо удаления происходит замещение: атрибуту просто устанавливается значение по умолчанию.

removeAttributeNode(nodeAttribute)

Удаляет переданный объект узла-атрибута. Если этот атрибут имеет значение по умолчанию, вместо удаления происходит замещение: атрибуту просто устанавливается значение по умолчанию.

appendChild(newChildNode)

Добавляет текущему узлу новый дочерний элемент и возвращает ссылку на этот элемент. То же самое можно сделать вызовом insertBefore(newChildNode, null).

insertBefore(newChildNode, refChildNode)

Вставляет новый дочерний узел (newChildNode) перед указанным существующим дочерним узлом (refChildNode). Если последний параметр не задан, новый дочерний узел будет добавлен в конец.

replaceChild(newChildNode, oldChildNode)

Заменяет указанный дочерний объект текущего элемента на новый и возвращает старый дочерний объект. Если новый дочерний объект - null, старый дочерний объект будет просто удалён.

removeChild(childNode)

Удаляет указанный дочерний объект текущего элемента и возвращает его.

Все методы, которые создают новые объекты (createElement, createAttribute и подобные) не выполняют никакой работы, кроме непосредственно самого создания объектов. Для включения созданных объектов в документ надо дополнительно вызывать методы appendChild, insertBefore и подобные.

Пример создания нового XML-документа:

Set xmlParser = CreateObject("Msxml2.DOMDocument")

'Создание объявления XML

xmlParser.appendChild(xmlParser.createProcessingInstruction("xml", "version='1.0' encoding='windows-1251'"))

'Создание комментария

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]