Использование XPath для запроса к пользовательскому пространству имен по умолчанию
В этой статье описывается использование XPath для запроса к пространству имен, определяемого пользователем по умолчанию, и предоставляется код для воспроизведения поведения.
Исходная версия продукта: Visual Basic
Исходный номер базы знаний: 288147
Симптомы
При переопределении пространства имен по умолчанию в XML-документе измените внутреннее SelectionNamespaces
свойство для пространства имен по умолчанию, а затем попытайтесь программно использовать XPath для возврата узлов с помощью selectNodes
метода или selectSingleNodes
, узлы не возвращаются.
Решение
При указании SelectionNamespaces
свойства используйте префиксы с пространствами имен или используйте операции сопоставления шаблонов XSL вместо XPath.
Дополнительная информация
Такое поведение является особенностью данного продукта.
Реализация запросов XPath к DOMDocument требует объявления пространств имен в модели DOM перед выполнением selectNodes
методов или selectSingleNode
.
Действия по воспроизведению поведения
В Visual Basic создайте проект СТАНДАРТНОГО EXE. Форма Form1 создается по умолчанию.
Вставьте следующий код в
Form_Unload()
событие Form1.' You can change the ProgID to reflect the installed version of the Microsoft XML Parser: ' For example, with MSXML 6, you would use: ' Dim xmlDom As MSXML2.DOMDocument60 Dim xmlDom As MSXML2.DOMDocument Dim nodeList As MSXML2.IXMLDOMNodeList Dim iNode As MSXML2.IXMLDOMNode ' For example, with MSXML 6, you would use: ' Set xmlDom = New MSXML2.DOMDocument60 Set xmlDom = New MSXML2.DOMDocument With xmlDom .async = False .loadXML "<?xml version='1.0'?>" & _ "<Root xmlns='uri:MyNameSpace'>" & _ " <Test>This is a Test</Test>" & _ "</Root>" .setProperty "SelectionLanguage", "XPath" .setProperty "SelectionNamespaces", "xmlns='uri:MyNameSpace'" Set nodeList = .selectNodes("//Test") End With For Each iNode In nodeList msgbox iNode.xml Next iNode
В меню Проект выберите ссылки. В списке доступных ссылок выберите Microsoft XML версии 3.0 или более поздней версии.
Запустите проект. XML не возвращается.
Закомментируйте два
setProperty
метода.Примечание.
Кроме того, можно изменить две строки кода следующим образом.
.setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'" Set nodeList = .selectNodes("//myNS:Test")
Запустите проект. Возвращаются XML-узлы.
Ссылки
Указание пространства имен при запросе модели DOM с помощью XPath