この記事は、既定の名前空間宣言を指定する 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 プロジェクトを使用して問題を再現し、指定した解決策をテストするには、次の手順に従います。
メモ帳で、ドライブ
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>
Visual Basic で、新しい Standard EXE プロジェクトを作成します。
Microsoft XML バージョン 6.0 への参照を追加します。
コマンド ボタンを Form1 にドラッグします。
コマンド ボタンの Click イベント プロシージャに次のコードを貼り付けます。
ノート
このコードは、MSXML 6.0
DOMDocument60
オブジェクトのインスタンスにサンプル Books.xml ドキュメントを読み込みます。 次に、SelectNodes DOM メソッドを使用して、DOMDocument60
オブジェクトに対して XPath クエリを実行し、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
プロジェクトを保存して実行します。
フォームが表示されたら、コマンド ボタンをクリックします。 XPath クエリは有効ですが、結果は生成されず、一致するタイトルは Visual Basic イミディエイト ウィンドウに書き込まれません。
プロジェクトを停止します。
Set xmldoc = New MSXML2.DOMDocument60
ステートメントの直後に次のコード行のコメントを解除し、DOMDocument
オブジェクトの名前空間名に名前空間プレフィックスを指定して、既定の名前空間宣言を追加します。'xmldoc.setProperty "SelectionNamespaces", "xmlns:bk='urn:books'"
XPath クエリの実行に使用する
selectNodes
DOM メソッドの呼び出しをコメント化します。Set bookList = xmldoc.selectNodes("//Publisher[. = 'MSPress']/parent::node()/Title")
次のステートメントのコメントを解除します。
'Set bookList = xmldoc.selectNodes("//bk:Publisher[. = 'MSPress']/parent::node()/bk:Title")
ノート
要素名には、既定の名前空間宣言が
DOMDocument
オブジェクトの名前空間名に追加されるときに指定する bk 名前空間エイリアスがプレフィックスとして付けられます。プロジェクトを保存して実行します。 フォームが表示されたら、コマンド ボタンをクリックします。 一致するノードは、Visual Basic イミディエイト ウィンドウに一覧表示されます。