次の方法で共有


MSXML 6.0: 既定の名前空間宣言を指定する XML ドキュメントに対して XPath クエリを実行しても、一致するノードは返されません

この記事は、既定の名前空間宣言を指定する XML ドキュメントに対して XPath クエリを実行するときに、一致するノードが返されない問題を解決するのに役立ちます。

元の製品バージョン: Microsoft XML
元の KB 番号: 313372

現象

MSXML 6.0 Document Object Model (DOM) メソッド (selectNodes および selectSingleNode) を使用して、既定の名前空間宣言を指定する XML ドキュメントに対して XPath クエリを実行する場合、一致するノードは返されません。

原因

既定の名前空間宣言は DOMDocument オブジェクトの名前空間名に追加されません。また、DOMDocument オブジェクトの名前空間名に追加されるときに、既定の名前空間宣言に名前空間プレフィックスが指定されていません。

解決方法

名前空間プレフィックスを指定して、DOMDocument オブジェクトの名前空間名に既定の名前空間宣言を追加します。 これを行うには、DOMDocument オブジェクトの メソッドを使用 setProperty して、内部プロパティを設定します SelectionNamespaces

詳細

MSXML 6.0 では XSLPattern クエリ言語がサポートされなくなりました。 XPath クエリ言語のみがサポートされます。 これは、XML ドキュメント内のノードにアクセスするための単純なツリー スタイルの階層クエリも、MSXML 6.0 の XPath クエリとして実行されることを意味します。 MSXML 6.0 DOM を使用して、既定の名前空間宣言を指定する XML ドキュメントに対して XPath クエリを実行する場合は、オブジェクトのメソッドを使用 setProperty して、名前空間プレフィックスを指定して既定の DOMDocument 名前空間宣言をオブジェクトの DOMDocument 名前空間名に追加する必要があります。

動作を再現する手順

問題を再現し、Visual Basic Standard EXE プロジェクトを使用して指定した解決策をテストするには、次の手順に従います。

  1. メモ帳で、ドライブ C:のルート フォルダーに Books.xml という名前の次の XML を含む XML ドキュメントを作成します。

    <?xml version='1.0'?>
    <Books xmlns="urn:books">
        <Book>
            <Title>Beginning XML</Title>
            <Publisher>Wrox</Publisher>
        </Book>
        <Book>
            <Title>XML Step by Step</Title>
            <Publisher>MSPress</Publisher>
        </Book>
        <Book>
            <Title>Professional XML</Title>
            <Publisher>Wrox</Publisher>
        </Book>
        <Book>
            <Title>Developing XML solutions</Title>
            <Publisher>MSPress</Publisher>
        </Book>
    </Books>
    
  2. Visual Basic で、新しい Standard EXE プロジェクトを作成します。

  3. Microsoft XML バージョン 6.0 への参照を追加します。

  4. コマンド ボタンを Form1 にドラッグします。

  5. コマンド ボタンの Click イベント プロシージャに次のコードを貼り付けます。

    注:

    このコードでは、サンプル Books.xml ドキュメントを MSXML 6.0 DOMDocument60 オブジェクトのインスタンスに読み込みます。 次に、SelectNodes DOM メソッドを使用して、オブジェクトに対して XPath クエリを DOMDocument60 実行し、MSPress によって発行されたタイトルを識別します。

    Dim xmldoc As MSXML2.DOMDocument60
    Dim bookList As MSXML2.IXMLDOMNodeList
    Dim bookNode As MSXML2.IXMLDOMNode
    
    Set xmldoc = New MSXML2.DOMDocument60
    'xmldoc.setProperty "SelectionNamespaces", "xmlns:bk='urn:books'"
    xmldoc.Load "c:\books.xml"
    
    Set bookList = xmldoc.selectNodes("//Publisher[. = 'MSPress']/parent::node()/Title")'Set bookList = xmldoc.selectNodes("//bk:Publisher[. = 'MSPress']/parent::node()/bk:Title")
    
    For Each bookNode In bookList
        Debug.Print "Title : " & bookNode.Text
    Next
    
  6. プロジェクトを保存して実行します。

  7. フォームが表示されたら、コマンド ボタンをクリックします。 XPath クエリは有効ですが、結果は生成されず、一致するタイトルは Visual Basic イミディエイト ウィンドウに書き込まれません。

  8. プロジェクトを停止します。

  9. ステートメントの直後に次のコード行のコメントを Set xmldoc = New MSXML2.DOMDocument60 解除し、名前空間プレフィックスをオブジェクトの名前空間名に指定して、既定の名前空間宣言を DOMDocument 追加します。

    'xmldoc.setProperty "SelectionNamespaces", "xmlns:bk='urn:books'"
    
  10. XPath クエリの実行に selectNodes 使用される DOM メソッドへの呼び出しをコメントします。

    Set bookList = xmldoc.selectNodes("//Publisher[. = 'MSPress']/parent::node()/Title")
    
  11. 次のステートメントのコメントを解除します。

    'Set bookList = xmldoc.selectNodes("//bk:Publisher[. = 'MSPress']/parent::node()/bk:Title")
    

    注:

    要素名の前に、既定の名前空間宣言をオブジェクトの名前空間名に追加するときに指定する bk 名前空間エイリアスが DOMDocument 付きます。

  12. プロジェクトを保存して実行します。 フォームが表示されたら、コマンド ボタンをクリックします。 一致するノードは、[Visual Basic イミディエイト] ウィンドウに一覧表示されます。