XPath を使用して、ユーザー定義の既定の名前空間に対してクエリを実行する
この記事では、XPath を使用してユーザー定義の既定の名前空間に対してクエリを実行する方法について説明し、動作を再現するコードを提供します。
元の製品バージョン: Visual Basic
元の KB 番号: 288147
現象
XML ドキュメントで既定の名前空間を再定義する場合は、既定の名前空間の内部SelectionNamespaces
プロパティを変更してから、プログラムによって XPath を使用して または selectSingleNodes
メソッドを使用してノードをselectNodes
返すようにします。ノードは返されません。
解決方法
プロパティを指定 SelectionNamespaces
するときに名前空間でプレフィックスを使用するか、XPath ではなく拡張スタイルシート言語 (XSL) パターンマッチング操作を使用します。
詳細
この動作は仕様です。
DOMDocument に対する XPath クエリの実装では、 メソッドまたは selectSingleNode
メソッドを実行する前に、ドキュメント オブジェクト モデル (DOM) で名前空間をselectNodes
宣言する必要があります。
動作の再現手順
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 ノードが返されます。