1

我在使用带有 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 变量等。。首先,我得到所有element具有-属性的“”-节点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 语句oNodeMain,它在每个循环中获取下一个节点。也许我只需要在循环中修改 XPath 表达式并且不要使用“ //”,因为它可以工作,但我不知道为什么。

我为此使用的程序是 Paradox 11,我使用 OLE 的 MSXML。这种行为“正常”吗,我的误解在哪里?欢迎任何有关如何实现我正在尝试的建议。

4

1 回答 1

4

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

您的路径//从根节点(也称为文档节点)开始搜索。

于 2013-02-06T11:51:11.530 回答