XPath如何处理元素和属性文本中的逗号?

时间:2011-11-23 00:21:13

标签: xml xpath

我正在使用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表达式和逗号的信息,但没有发现任何有用的信息。为什么文本没有读过第一个逗号?

1 个答案:

答案 0 :(得分:1)

逗号在元素的文本或属性值中是完全合法的,并且XPath应该选择整个字符串而不在两种情况下将其拆分,这表明主机环境中存在问题。

实际上,文档中说逗号在分层配置中用作默认分隔符:

  

可以使用分隔符以简短形式定义属性列表   character(默认为逗号)。在这个例子中   buttons.name属性有三个值OK,Cancel和Help,所以它   使用getList()方法查询。这也适用于属性。   使用AbstractConfiguration的静态setDefaultDelimiter()方法   您可以全局定义不同的分隔符或 -   将分隔符设置为0 - 完全禁用此机制。   在分隔符字符前放置反斜杠将使其转义。这个   在numberFormat元素的pattern属性中演示。

来源: http://commons.apache.org/configuration/userguide/howto_xml.html#Accessing_properties_in_hierarchical_configurations

该文档还有一节解释了为什么这个功能可能是一个错误的决定,并包含有关禁用它的更多具体细节。我建议阅读整篇文章。