如何使用 XQuery 从 Java 使用 Saxon 输出 json
How to use XQuery to output json using Saxon from Java
我正在使用 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,returns 正确
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 输出中的 "map" 在我用来读取结果的 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);
我正在使用 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,returns 正确
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 输出中的 "map" 在我用来读取结果的 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);