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


Симптомы


Если переопределить пространство имен по умолчанию в 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-узлов.

ССЫЛКИ

Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:

Как 294797 для указания пространства имен при запросе DOM с XPath