我在使用带有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
元素。
以//
开头的路径从根节点(也称为文档节点)进行搜索。