2014-11-24 54 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