XPath with MSXML, “scope” of XPath-expressions

你说的曾经没有我的故事 提交于 2020-01-05 05:28:10

问题


i have an understanding-problem using Microsoft XML Core Services 6.0 (MSXML) with XPath-expressions. I´ve broken down the problem to the most simple case. So let´s take the following XML-File:

<?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>

I want to get the "value"-attribues per "element". I will use pseudo-code to describe my problem and i will focus on the important things, so i will not write how i initialize the Msxml2.DOMDocument variable etc. . First, i get all "element"-nodes that have a name-attribute:

oNodeList = oDom.selectNodes("//element[@name]")

The result of the selectNodes-statement is a nodelist, where i access the items node by node in a for-loop. In this loop, i execute another selectNodes-statement, that gives me (at least i thought so) the "subEle"s for each "element":

for i from 1 to oNodeList.length
    oNodeMain = oNodeList.nextNode()    
    oNodeResList = oNodeMain.selectNodes("//subEle")
    msgInfo("n items", oNodeResList.length)
endFor

And here comes the problem: the selectNodes-statement in the loops seems to have ALL "subEle"s in scope; the messagebox pops up three times, telling me the length of the nodelist is 9. I would have expected that it pops up 3 times, telling me each time that the nodelist has a length of 3 (because every "element" has exactly 3 "subEle"s), since i´m doing the selectNodes-statement on "oNodeMain", which gets the nextNode in each loop. Maybe i just need to modify XPath-expression in the loop and don´t use the "//", because it works then, but i have no idea why.

The program i use for this is Paradox 11 and i use MSXML by OLE. Is this behaviour "normal", where is my misunderstanding? Any suggestions on how to achieve what i´m trying are welcome.


回答1:


Don't use an absolute path starting with /, instead use a relative path i.e. oNodeMain.selectNodes("subEle") selects all subEle child elements of oNodeMain and oNodeMain.selectNodes(".//subEle") selects all descendant subEle elements of oNodeMain.

Your path starting with // searches from the root node (also called document node).



来源:https://stackoverflow.com/questions/14728102/xpath-with-msxml-scope-of-xpath-expressions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!