1

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 を使用します。この動作は「正常」ですか、私の誤解はどこにありますか? 私がしようとしていることを達成する方法についての提案は大歓迎です。

4

1 に答える 1

4

で始まる絶対パスを使用しないでください/。代わりに相対パスを使用してください。つまり、のoNodeMain.selectNodes("subEle")すべてのsubEle子要素をoNodeMain選択し、 のoNodeMain.selectNodes(".//subEle")すべての子孫subEle要素を選択しoNodeMainます。

//ルート ノード (ドキュメント ノードとも呼ばれます) からの検索で始まるパス。

于 2013-02-06T11:51:11.530 に答える