我正在使用commons配置从我自己设计的XML文件中读取SQL查询,以下是配置文件中查询的两个略有不同的示例:
<query name="authenticateAccount" type="function">
<sql>
{ ? = call account_authenticate(?, ?) }
<parameter name="retun" type="java.sql.Types.BOOLEAN" direction="out" index="1" />
<parameter name="supplied_email" type="java.lang.String" direction="in" index="2" />
<parameter name="supplied_pw" type="java.lang.String" direction="in" index="3" />
</sql>
</query>
<query name="authenticateAccount" type="function">
<sql text="{ ? = call account_authenticate(?, ?) }">
<parameter name="retun" type="java.sql.Types.BOOLEAN" direction="out" index="1" />
<parameter name="supplied_email" type="java.lang.String" direction="in" index="2" />
<parameter name="supplied_pw" type="java.lang.String" direction="in" index="3" />
</sql>
</query>
查询文本(在上面的sql元素的文本或“text”参数中看到)将作为参数提供给java.sql.Connection.prepareCall()以创建JDBC CallableStatement。
但是,当
读取该文本时// I tried both of these for the first xml example:
HeirarchicalConfiguration.getString("query[@name='authenticateAccount']/sql/text()")
HeirarchicalConfiguration.getString("query[@name='authenticateAccount']/sql")
// The following for the second xml example:
HeirarchicalConfiguration.getString("query[@name='authenticateAccount']/sql/@text")
这些XPath表达式读取查询文本,但不包括第一个逗号:
{ ? = call account_authenticate(?
在显示使用XPath表达式读入的文本时,我看到的是什么。
我尝试用XML搜索有关XPath表达式和逗号的信息,但没有发现任何有用的信息。为什么文本没有读过第一个逗号?
答案 0 :(得分:1)
逗号在元素的文本或属性值中是完全合法的,并且XPath应该选择整个字符串而不在两种情况下将其拆分,这表明主机环境中存在问题。
实际上,文档中说逗号在分层配置中用作默认分隔符:
可以使用分隔符以简短形式定义属性列表 character(默认为逗号)。在这个例子中 buttons.name属性有三个值OK,Cancel和Help,所以它 使用getList()方法查询。这也适用于属性。 使用AbstractConfiguration的静态setDefaultDelimiter()方法 您可以全局定义不同的分隔符或 - 将分隔符设置为0 - 完全禁用此机制。 在分隔符字符前放置反斜杠将使其转义。这个 在numberFormat元素的pattern属性中演示。
该文档还有一节解释了为什么这个功能可能是一个错误的决定,并包含有关禁用它的更多具体细节。我建议阅读整篇文章。