我对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
问题:
节点变量只返回第一个元素。我已经验证了用于qry
的{{1}}字符串是正确的Id值(即USER002) - 但是节点正在加载USER001元素。很显然,xPath表达式搞砸了。我需要对xPath表达式进行调整,以便返回正确的SelectSingleNode
元素和相应的子<Id>
元素。
任何帮助将不胜感激。
答案 0 :(得分:0)
Google XML COOKTOP并安装它。这是一个很棒的小软件应用程序,用于在XML数据文件上尝试XPATH和XSLT表达式并查看结果。
答案 1 :(得分:0)
看起来你正在尝试构建像//Id['USER002']
这样的表达式。这将选择有效布尔值'USER002'为真的所有E元素 - 这些都是它们。目前还不清楚你的意图,因为你的XML样本很乱,但它应该像//Id[@id='USER002']
另外,你真的不应该通过字符串连接来构造XPath表达式。当有人提供包含引号的字符串时,它会使您容易发生注射攻击和意外故障。它效率也很低。构造包含变量引用$ param的字符串,并从API设置参数。 (我不知道怎么在VB中这样做。)