我有一個使用Microsoft XML Core Services 6.0(MSXML)和XPath表達式的理解問題。 我已將問題分解爲最簡單的情況。所以let's採取以下XML的文件:帶有MSXML的XPath,XPath表達式的「範圍」
<?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
」 -attribues每個‘元素’。我將使用僞代碼來描述我的問題 ,我將專注於重要的事情,所以我不會寫我如何初始化Msxml2.DOMDocument變量等 。 首先,我得到的所有「element
」 -nodes有一個name
-attribute:
oNodeList = oDom.selectNodes("//element[@name]")
中的selectNodes語句的結果是一個節點列表,在這裏我通過節點 在for循環訪問項目節點。在這個循環中,我執行另一個的selectNodes語句,這給了我(至少我是這麼認爲的) 的「subEle
‘S每個’element
」:
for i from 1 to oNodeList.length
oNodeMain = oNodeList.nextNode()
oNodeResList = oNodeMain.selectNodes("//subEle")
msgInfo("n items", oNodeResList.length)
endFor
這裏來的問題:的selectNodes語句在循環似乎有所有「subEle」的 在範圍內;該消息箱彈出三次,告訴我節點列表的長度是9. 我本以爲它會彈出3次,每次告訴我節點列表的長度爲3(因爲 每個「element
」都有3「subEle
」),因爲我正在執行「oNodeMain
」, 上的selectNodes語句,該語句在每個循環中獲取nextNode。也許我只需要修改循環中的XPath表達式,並且 不要使用「//
」,因爲它可以工作,但我不知道爲什麼。
我使用的程序是Paradox 11,我使用OLE的MSXML。 這種行爲「正常」,我的誤解在哪裏?任何建議如何實現我 嘗試是值得歡迎的。
謝謝,我知道使用「//」會搜索整個節點,但我只是不明白爲什麼每個節點都在範圍內,因爲oNodeMain只是節點列表中的一個節點。 :-( – whocares81
原因是'oNodeMain'仍然是整個文檔的一部分,而以'/開頭的XPath遍歷從根開始的文檔。 – JLRishe
如果你做了'oNodeMain.selectNodes(「/」)'你選擇根節點或文檔節點oNodeMain包含在(即與你的oDom變量相同的節點中)並且任何以/開頭的路徑從該根節點中選擇下來基本上XPath允許你導航因爲你正在處理一個節點列表中的特定節點,所以你需要使用如下所示的相對路徑('selectNodes(「 subEle「)'子元素或'selectNodes(」descendant :: subEle「)''或'selectNodes(」.// subEle「)')。 –