次の方法で共有


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

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

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

症状

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

解決方法

SelectionNamespaces プロパティを指定するときに名前空間でプレフィックスを使用するか、XPath の代わりに Extensible Stylesheet Language (XSL) パターンマッチング操作を使用します。

詳細

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

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

動作を再現する手順

  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 にクエリを実行するときに名前空間を指定する方法