XPath を使用してユーザー定義の既定の名前空間に対してクエリする方法


現象


XML ドキュメントの既定の名前空間を再定義、既定名前空間は、内部のSelectionNamespacesプロパティを変更しようとするし、 selectNodesメソッドまたはselectSingleNodesメソッドを使用してノードを取得する XPath を使用してプログラムを使用して、ノードは返されません。

解決策


いずれか、 SelectionNamespacesプロパティを指定するか、XPath ではなくパターン一致操作の拡張スタイル シート言語 (XSL) を使用すると、名前空間のプレフィックスを使用します。

詳細


これは仕様による動作です。

DOMDocumentに対して XPath クエリの実装では、その名前空間は、 selectNodesメソッドまたはカスタムメソッドを実行する前にドキュメント オブジェクト モデル (DOM) でを宣言する必要があります。

現象を再現する手順を実行します。

  1. Visual Basic で、新しい標準 EXE プロジェクトを作成します。デフォルトで Form1 が作成されます。
  2. Form1 の Form_Unload() イベントに次のコードを貼り付けます。
        ' 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、v3.0を選択またはそれ以降です。
  4. プロジェクトを実行します。XML は返されません。
  5. SetPropertyメソッドを 2 つをコメント化します。: 代わりに、2 行のコードを次のように変更できます。
            .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"        Set nodeList = .selectNodes("//myNS:Test")

  6. プロジェクトを実行します。XML ノードが返されます。

参照

詳細については、次の文書番号をクリックして、マイクロソフト サポート技術情報の資料をご参照ください。

DOM で XPath クエリを実行するときに名前空間を指定するには、方法を294797