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

この記事では、XPath を使用してユーザー定義の既定の名前空間に対してクエリを実行する方法について説明し、動作を再現するコードを提供します。

元の製品バージョン: Visual Basic
元の KB 番号: 288147

現象

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

解決方法

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

詳細

この動作は仕様です。

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

動作の再現手順

  1. Visual Basic で、新しい Standard 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. 2 つの setProperty メソッドをコメント アウトします。

    注:

    または、次のように 2 行のコードを変更できます。

    .setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'"
    Set nodeList = .selectNodes("//myNS:Test")
    
  6. プロジェクトを実行します。 XML ノードが返されます。

関連情報

XPath を使用して DOM にクエリを実行するときに名前空間を指定する方法