XPath with MSXML,XPath-expressions 的"作用域"



我在使用带有XPath表达式的Microsoft XML Core Services 6.0(MSXML)时遇到了理解问题。我已经把这个问题分解成最简单的例子。因此,让我们采用以下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变量等。首先,我得到所有具有name-属性的"element"-节点:

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

selectNodes语句的结果是一个nodelist,我在其中逐节点访问项在for循环中。在这个循环中,我执行另一个selectNodes语句,它给了我(至少我是这么认为的)每个"element"的"subEle":

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

问题来了:循环中的selectNodes语句似乎有ALL"subEle"范围;消息框弹出三次,告诉我节点列表的长度是9。我本以为它会弹出3次,每次都告诉我节点列表的长度为3(因为每个"element"正好有3个"subEle"),因为我正在对"oNodeMain"执行selectNodes语句,其获得每个循环中的下一个节点。也许我只需要在循环中修改XPath表达式不要使用"//",因为它当时有效,但我不知道为什么。

我使用的程序是Paradox 11,我通过OLE使用MSXML。这种行为"正常"吗?我的误解在哪里?关于如何实现我的目标的任何建议欢迎尝试。

不要使用以/开头的绝对路径,而是使用相对路径,即oNodeMain.selectNodes("subEle")选择oNodeMain的所有subEle子元素,oNodeMain.selectNodes(".//subEle")选择oNodeMain的所有子代subEle元素。

//开头的路径从根节点(也称为文档节点)进行搜索。

相关内容

  • 没有找到相关文章

最新更新