Использование XPath для запроса к пользовательскому пространству имен по умолчанию

В этой статье описывается использование XPath для запроса к пространству имен, определяемого пользователем по умолчанию, и предоставляется код для воспроизведения поведения.

Исходная версия продукта: Visual Basic
Исходный номер базы знаний: 288147

Симптомы

При переопределении пространства имен по умолчанию в XML-документе измените внутреннее SelectionNamespaces свойство для пространства имен по умолчанию, а затем попытайтесь программно использовать XPath для возврата узлов с помощью selectNodes метода или selectSingleNodes , узлы не возвращаются.

Решение

При указании SelectionNamespaces свойства используйте префиксы с пространствами имен или используйте операции сопоставления шаблонов XSL вместо XPath.

Дополнительная информация

Такое поведение является особенностью данного продукта.

Реализация запросов XPath к DOMDocument требует объявления пространств имен в модели DOM перед выполнением selectNodes методов или selectSingleNode .

Действия по воспроизведению поведения

  1. В Visual Basic создайте проект СТАНДАРТНОГО EXE. Форма Form1 создается по умолчанию.

  2. Вставьте следующий код в 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
    
  3. В меню Проект выберите ссылки. В списке доступных ссылок выберите Microsoft XML версии 3.0 или более поздней версии.

  4. Запустите проект. XML не возвращается.

  5. Закомментируйте два setProperty метода.

    Примечание.

    Кроме того, можно изменить две строки кода следующим образом.

    .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"
    Set nodeList = .selectNodes("//myNS:Test")
    
  6. Запустите проект. Возвращаются XML-узлы.

Ссылки

Указание пространства имен при запросе модели DOM с помощью XPath