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 プロジェクトを使用して指定した解決策をテストするには、次の手順に従います。
メモ帳で、ドライブ
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 イベント プロシージャに次のコードを貼り付けます。
注:
このコードでは、サンプル 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
プロジェクトを保存して実行します。
フォームが表示されたら、コマンド ボタンをクリックします。 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")
注:
要素名の前に、既定の名前空間宣言をオブジェクトの名前空間名に追加するときに指定する bk 名前空間エイリアスが
DOMDocument
付きます。プロジェクトを保存して実行します。 フォームが表示されたら、コマンド ボタンをクリックします。 一致するノードは、[Visual Basic イミディエイト] ウィンドウに一覧表示されます。