Microsoft XML Core Services 6.0 (MSXML) を XPath 式で使用する際に理解に問題があります。問題を最も単純なケースに分解しました。それでは、次の XML ファイルを見てみましょう。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element name="E1A1">
<subEle value="1a"/>
<subEle value="1b"/>
<subEle value="1c"/>
</element>
<element name="E2A1">
<subEle value="2a"/>
<subEle value="2b"/>
<subEle value="3b"/>
</element>
<element name="E3A1">
<subEle value="3a"/>
<subEle value="3b"/>
<subEle value="3c"/>
</element>
</root>
value
「要素」ごとに「」属性を取得したい。疑似コードを使用して問題を説明し、重要なことに焦点を当てるため、Msxml2.DOMDocument 変数などを初期化する方法については記述しません。最初に、element
-attribute を持つすべての " " ノードを取得しname
ます。
oNodeList = oDom.selectNodes("//element[@name]")
selectNodes ステートメントの結果はノードリストであり、for ループでノードごとに項目にアクセスします。このループでは、別の selectNodes ステートメントを実行します。これにより、(少なくとも私はそう思っていました)subEle
各 " " の " " が得られelement
ます。
for i from 1 to oNodeList.length
oNodeMain = oNodeList.nextNode()
oNodeResList = oNodeMain.selectNodes("//subEle")
msgInfo("n items", oNodeResList.length)
endFor
ここで問題が発生します。ループ内の selectNodes ステートメントには、すべての「subEle」がスコープ内にあるようです。メッセージボックスが 3 回ポップアップ表示され、ノードリストの長さが 9 であることが通知されます。ノードリストの長さが 3 であることを毎回通知するメッセージボックスが 3 回表示されることを期待していました (すべての " element
" には正確に 3 つの " " がsubEle
あるためです)。 s)、" " で selectNodes-statement を実行しているためoNodeMain
、各ループで nextNode を取得します。たぶん、ループ内の XPath 式を変更する必要があり、「//
」を使用しないでください。その場合は機能するためですが、その理由はわかりません。
これに使用するプログラムは Paradox 11 で、MSXML by OLE を使用します。この動作は「正常」ですか、私の誤解はどこにありますか? 私がしようとしていることを達成する方法についての提案は大歓迎です。