eXist-db从同一集合的许多XML中获取数据

时间:2014-11-24 07:19:26

标签: java groovy xquery exist-db openehr

我是使用eXist-db的新手。使用Java / Groovy我正在尝试(没有运气)从我创建的集合中获取数据:/db/apps/compositions

/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文本,但是我没有得到任何结果,也没有抛出异常。

有什么想法吗?

非常感谢!

BTW:我试图找到实现Java客户端的其他方法,但无法为初学者找到明确的指南或教程。

1 个答案:

答案 0 :(得分:4)

你遇到的问题是名称空间;您的元素位于默认命名空间中,因此您需要在查询中定义该命名空间。

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

可能会减慢对大型数据集的查询速度。