2011-11-23 159 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