2011-05-04 168 views
0

我在使用xPath表達式時遇到了一些困難。XPath查詢幫助語法

上下文:我正在使用XML文檔將查詢/存儲過程名稱存儲在ASP應用程序中。我使用實用函數來加載xmldocument(如果它以前沒有加載過),我試圖從文檔中選擇與Id元素相匹配的節點集。這是我的XML文檔:

<Queries> 
    <Id>USER001 
    <Sql>spUsers_GetUserByUserName</Sql> 
    </Id > 
    <Id <USER002 
    <Sql>spUsers_GetUserByEmail</Sql> 
</Queries> 

下面是代碼(我用VB.NET)

Module Utility 

private sqlXml as xmldocument 

'....other stuff..... 


Public Function GetSql(queryId as string) as string 

dim qry as string 
dim node as XmlNode 

if sqlXml is nothing then 
    sqlXml = new xmldocument 
    sqlXml.Load (..path) 
end if 

qry = "//Id['" & queryId & "']" 'xPath to select the Id node = to paramter passed 

node = sqlxml.SelectSingleNode(qry) 'set node <Id><Sql></Sql></Id> 

return node.SelectSingleNode("//Sql").InnerText 'Return the Sql element value from the Id 

End Function 

問題:

節點變量只返回的第一個元素。我已驗證用於SelectSingleNodeqry字符串是正確的Id值(即USER002) - 但是該節點正在使用USER001元素加載。這顯然是xPath表達式搞砸了。我需要調整xPath表達式,以便我可以返回正確的<Id>元素和相應的子元素<Sql>

任何幫助,將不勝感激。

+0

@jbd:XML示例沒用。請發佈一個更好的例子,並使用**'{}'**按鈕。 – 2011-05-04 18:38:46

+0

@jbd:XML格式不正確。 – 2011-05-04 19:39:19

回答

0

Google XML COOKTOP並安裝它。這是一個很棒的小免費軟件,用於試用XML數據文件上的XPATH和XSLT表達式並查看結果。

0

它看起來像你試圖構建一個表達式,如//Id['USER002']。這將選擇所有有效的布爾值'USER002'爲真的E元素 - 這就是他們全部。目前還不清楚你的意圖是什麼,因爲你的XML樣本很混亂,但它應該是類似於//Id[@id='USER002']

另外,你真的不應該通過字符串連接構造XPath表達式。當有人提供包含引號的字符串時,它容易發生注入攻擊和意外失效。這也是低效的。構造一個包含變量引用$ param的字符串,並從API中設置參數。 (不知道如何在VB中做到這一點,恐怕)。

+0

我很抱歉搞砸了XML。實際文件格式良好。邁克爾 - 這確實是我想要做的。最終效果是我試圖通過與提供的參數匹配的值來訪問Id標記的子標記的SQL標記。我使用的示例是由「USER002」提供的值;如果提供的話,我希望返回值爲spUsers_GetUserByEmail的Sql內部文本。這沒有發生 - 我正在獲取spUsers_GetUserByUsername。我會嘗試你的建議「// Id [@ Id ='」&queryId&「']」。我也研究你指定的技術。謝謝。 – jdb 2011-05-05 15:23:43