2013-02-06 51 views
1

我有一個使用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。 這種行爲「正常」,我的誤解在哪裏?任何建議如何實現我 嘗試是值得歡迎的。

回答

4

不要使用開始/絕對路徑,而不是使用相對路徑,即oNodeMain.selectNodes("subEle")選擇的oNodeMainoNodeMain.selectNodes(".//subEle")所有subEle子元素選擇的oNodeMain所有後代subEle元素。

從根節點(也稱爲文檔節點)搜索//開始的路徑。

+0

謝謝,我知道使用「//」會搜索整個節點,但我只是不明白爲什麼每個節點都在範圍內,因爲oNodeMain只是節點列表中的一個節點。 :-( – whocares81

+1

原因是'oNodeMain'仍然是整個文檔的一部分,而以'/開頭的XPath遍歷從根開始的文檔。 – JLRishe

+1

如果你做了'oNodeMain.selectNodes(「/」)'你選擇根節點或文檔節點oNodeMain包含在(即與你的oDom變量相同的節點中)並且任何以/開頭的路徑從該根節點中選擇下來基本上XPath允許你導航因爲你正在處理一個節點列表中的特定節點,所以你需要使用如下所示的相對路徑('selectNodes(「 subEle「)'子元素或'selectNodes(」descendant :: subEle「)''或'selectNodes(」.// subEle「)')。 –