2014-11-24 57 views
0

我是使用eXist-db的新手。使用Java/Groovy我想(沒有運氣)從我創建的集合中獲取數據:/db/apps/compositionseXist-db從同一集合中的很多XML獲取數據

/db/apps/compositions是一對情侶,看起來類似於此XML文檔:

<version xmlns="http://schemas.openehr.org/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ORIGINAL_VERSION"> 
    ... 
    <data xsi:type="COMPOSITION" archetype_node_id="openEHR-EHR-COMPOSITION.signos.v1"> 
    <name> 
     <value>xxxxx</value> 
    </name> 
    ... 
    </data> 
</version> 

我用我的客戶端代碼的XQJ API。我試着(從http://en.wikipedia.org/wiki/XQuery_API_for_Javahttp://xqj.net/exist/)適應示例代碼:

XQDataSource xqs = new ExistXQDataSource(); 
xqs.setProperty("serverName", "localhost"); 
xqs.setProperty("port", "8080"); 

XQConnection conn = xqs.getConnection("user","pass"); 

XQExpression expr = conn.createExpression(); 

XQResultSequence result = expr.executeQuery(
    "for $n in fn:collection('/db/apps/compositions')//data " + 
    "return fn:data($n/name/value)"); // execute an XQuery expression 

// Process the result sequence iteratively 
while (result.next()) { 
    // Print the current item in the sequence 
    System.out.println("Product name: " + result.getItemAsString(null)); 
} 

// Free all resources created by the connection 
conn.close(); 

我預期從/db/apps/compositions集合中的所有XML文檔得到xxxxx的文本,但我沒有得到任何結果,並沒有異常拋出。

任何想法?

非常感謝!

順便說一句:我試圖找到其他實現java客戶端的方法,但找不到明確的指導方針或初學者教程。

+1

'data'元素屬於'version'聲明的默認名稱空間。你可以在你的代碼中引入這個命名空間,或者通過編寫'*:data'來通配符。 – 2014-11-24 09:07:14

+2

如果您正在尋找Java客戶端示例,eXist書籍將整個「第13章 - 集成」全部用於查看選項並使用Java編寫客戶端:http://shop.oreilly.com/product/0636920026525.do 這本書應該在下個月印刷。然而,與此同時,集成章節(包括XQJ)的代碼示例可以在這裏找到:https://github.com/eXist-book/book-code/tree/master/chapters/integration – adamretter 2014-11-24 11:46:27

回答

3

你有的問題是所有關於命名空間;您的元素處於默認名稱空間中,因此您需要在查詢中定義該名稱空間。

xquery version "3.0"; 

declare default element namespace "http://schemas.openehr.org/v1"; 

for $n in fn:collection('/db/apps/compositions')//data 

return fn:data($n/name/value) 

閱讀更多例如tech wiki

一般來說,我建議先在優秀的eXide IDE中測試查詢,然後再將它們合併到代碼中。 IDE爲您提供查詢結果的快速反饋,因此您可以查詢一下。

需要注意的是對大數據集寫

*:data 

威力放緩查詢。

+0

現在查詢得到結果,只有一個問題: 版本/數據元素也具有名爲「data」的後代節點,並且還帶有名稱/值元素,並且查詢獲取所有後代的名稱。 有沒有辦法只獲取第一個數據元素的名稱/值? 順便說一句,這是我修改後的代碼在Groovy:https://github.com/ppazos/clinical-database-tests/blob/master/src/existdb/TestExistDB.groovy – 2014-11-24 14:39:43

+0

請一個明確的XML示例,我不'不懂你在寫什麼,對不起; 它可能看起來像取決於您的確切結構 ' xquery version「3.0」; 聲明默認元素命名空間「http://schemas.openehr。($/name/value) 返回fn:data($ n/name/value) – DiZzZz 2014-11-24 15:10:37

+0

在這裏你可以找到一個完整的例子:https://github.com/ppazos/clinical-database-tests/blob/master/compositions/composition_8741_0.xml如你所見,** version/data **元素具有後代元素(子,孫,...),它們也被命名爲_data_並具有**名稱/值**。查詢返回文檔中聲明的所有**數據/名稱/值**,而不僅僅是**版本/數據/名稱/價值**,我試圖得到。 – 2014-11-24 18:43:29