java - 如何使用 XQuery 从 Java 使用 Saxon 输出 json

标签 java xquery saxon

我正在使用 XQuery 将下面的 XML 文档转换为 JSON,并使用 Saxon 处理 XQuery 文件。

<books>
   <book id="book1">
      <author>Book1AuthorSurname, Book1AuthorFirstname</author>
      <title>Book1 Title</title>
      <price>45.00</price>
   </book>
   <book id="book2">
      <author>Book2AuthorSurname, Book2AuthorFirstname</author>
      <title>Book2 Title</title>
      <price>45.00</price>
   </book>
</books>

XQuery 本身非常简单

xquery version "3.1";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; 
declare namespace map = "http://www.w3.org/2005/xpath-functions/map";

declare option output:method "json";
declare option output:indent "yes";

let $booksXML := doc("books.xml")/books

return array {
  for $book in $booksXML/book
  return map {
   "author": data($book/author),
   "title": data($book/title)
  }
}

并且,如果我使用 Saxon 从命令行运行它,则会正确返回

java -cp Saxon-HE-9.8.0-8.jar net.sf.saxon.Query -q:books2json.xqy

 [
   {
    "author":"Book1AuthorSurname, Book1AuthorFirstname",
    "title":"Book1 Title"
   },
   {
    "author":"Book2AuthorSurname, Book2AuthorFirstname",
    "title":"Book2 Title"
   }
 ]

但是使用下面的代码片段从 Java 运行它会得到稍微不同的结果

Processor saxon = new Processor(false);
XQueryCompiler compiler = saxon.newXQueryCompiler();
XQueryExecutable exec = compiler.compile(new File("books2json.xqy"));
XQueryEvaluator query = exec.load();
XdmValue result = query.evaluate();
System.out.println(result.toString());

[
    map{"author":"Book1AuthorSurname, Book1AuthorFirstname","title":"Book1 Title"},
    map{"author":"Book2AuthorSurname, Book2AuthorFirstname","title":"Book2 Title"}
]

Java 输出中的“映射”在我用来读取结果的 JSON 处理器中出现错误,是否有配置选项可以从结果中删除它?

最佳答案

如果您想分别直接写入 System.out 任何其他 Destination,那么您可以使用 run 方法,如下所示:

    Processor saxon = new Processor(false);
    XQueryCompiler compiler = saxon.newXQueryCompiler();
    XQueryExecutable exec = compiler.compile(new File("query1.xq"));
    XQueryEvaluator query = exec.load(); 

    query.run(saxon.newSerializer(System.out));
    System.out.println();

分别如果你想要一个字符串,在 StringWriter 上使用序列化程序:

    StringWriter sw = new StringWriter();
    query.run(saxon.newSerializer(sw));
    String result = sw.toString();
    System.out.println(result);

关于java - 如何使用 XQuery 从 Java 使用 Saxon 输出 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48987383/

相关文章:

java - 从 clojure 调用带有可选 null 参数的 java 函数

Java String.split() 正则表达式来分割数学表达式

java - 防止使用 ModelBuilder.createArrow 创建时箭头较长时为 "fatter"

java - 未找到 XPathFactory 实现,ubuntu 服务器中的 xpath 工厂实例创建问题。如何解决问题?

xml - 使用单个 XSL 流将一个大型 XML 文件拆分为多个文件

java - 从多个 XML 文件/字符串进行 Saxon/Javax 转换

java - 替换两个位置之间的字符串中的特定字符

xquery - Marklogic xquery 和有效循环子元素

java - 应该转换 xs :double to xs:decimal be implemented as BigDecimal. valueOf(double) 还是 new BigDecimal(double)?

java - XQuery Saxon 异常 (java.lang.IllegalArgumentException)