2011-11-23 31 views
1

我使用公共配置,从我自己设计的XML文件中读取SQL查询,下面是两个在配置文件中的查询略有不同的例子:XPath如何在元素和属性文本中处理逗号?

<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

第一个xml看起来真的很腥,第二个('/ sql/@ text')应该解析得很好,可能是你正在使用的解析器的问题 –

回答

1

逗号在元素的文本或属性值中是完全合法的,并且XPath应该在两种情况下都选择整个字符串而不分割它,这指出了主机环境中的问题。

事实上,文档说逗号用作在层次结构配置默认分离器:属性

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

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

该文件还具有部分解释为什么这个功能很可能是一个错误的决定,包括对禁用它更具体的细节。我建议阅读整个事情。

+0

非常好,谢谢。我想我没有想到检查commons配置文档,因为我预计它依赖于XPath。为什么人们需要像getList()这样的工具来解析结构化文档中的CSV?如果数据意图成为一个列表,请制作一个类似列表的结构! – Matt

+0

该文档看起来过时了:静态方法是AbstractConfiguration.setDefaultListDelimiter(char)http://commons.apache.org/configuration/apidocs/org/apache/commons/configuration/AbstractConfiguration.html#setDefaultListDelimiter(char)而我我不确定他们如何建议用char参数设置任何值为0--使用'0'实际上是为字符'0'上的列表分隔。 – Matt

+0

也许他们的意思是'\ 0'。 – Matt