- •If xmlParser.ParseError.ErrorCode Then
- •If Not nodeNode.Attributes Is Nothing Then
- •XmlParser.AppendChild(xmlParser.CreateComment("Текст комментария"))
- •VbCrLf & _
- •VbCrLf & _
- •VbCrLf & _
- •XmlParser.TransformNodeToObject objStylesheet, objResult
- •If xmlParser.DocumentElement.HasChildNodes Then
- •If nodeProduct.Attributes(0).Specified Then
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'"))
'Создание комментария