この記事では、XPath を使用してユーザー定義の既定の名前空間に対してクエリを実行する方法について説明し、動作を再現するコードを提供します。
元の製品バージョン: Visual Basic
元の KB 番号: 288147
症状
XML ドキュメントで既定の名前空間を再定義し、既定の名前空間の内部 SelectionNamespaces
プロパティを変更してから、XPath をプログラムで使用して、 selectNodes
メソッドまたは selectSingleNodes
メソッドを使用してノードを返そうとすると、ノードは返されません。
解決方法
SelectionNamespaces
プロパティを指定するときに名前空間でプレフィックスを使用するか、XPath の代わりに Extensible Stylesheet Language (XSL) パターンマッチング操作を使用します。
詳細
この動作は仕様によるものです。
DOMDocument に対する XPath クエリを実装するには、 selectNodes
メソッドまたは selectSingleNode
メソッドを実行する前に、ドキュメント オブジェクト モデル (DOM) で名前空間を宣言する必要があります。
動作を再現する手順
Visual Basic で、新しい Standard EXE プロジェクトを作成します。 Form1 は既定で作成されます。
次のコードを 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
[ プロジェクト ] メニューの [ 参照] をクリックします。 使用可能な参照の一覧から、Microsoft XML、v3.0 以降を選択します。
プロジェクトを実行します。 XML は返されません。
2 つの
setProperty
メソッドをコメント アウトします。注
または、次のように 2 行のコードを変更することもできます。
.setProperty "SelectionNamespaces", "xmlns:myNS='uri:MyNameSpace'" Set nodeList = .selectNodes("//myNS:Test")
プロジェクトを実行します。 XML ノードが返されます。