gpt4 book ai didi

java - 如何针对字符串中的 XML 运行 XQuery?

转载 作者:数据小太阳 更新时间:2023-10-29 02:06:39 25 4
gpt4 key购买 nike

我有一些 XML 的字符串表示,我想在内存中对其运行 XQuery。我一直在玩 Saxon 并想出了一个解决方案,但为了让它工作,我做了一件非常丑陋的事情。我有一种感觉,这是因为我缺乏使用 Saxon 的经验。这是一些有效的代码:

import javax.xml.transform.URIResolver;
import net.sf.saxon.Configuration;
import net.sf.saxon.s9api.*;

public class XmlTest {
public static void main(String[] args) {
try {
final String tableXml =
"<table>" +
" <columns>" +
" <column>Foo</column><column>Bar</column>" +
" </columns>" +
" <rows>" +
" <row><cell>Foo1</cell><cell>Bar1</cell></row>" +
" <row><cell>Foo2</cell><cell>Bar2</cell></row>" +
" </rows>" +
"</table>";

Configuration saxonConfig = new Configuration();
Processor processor = new Processor(saxonConfig);

XQueryCompiler xqueryCompiler = processor.newXQueryCompiler();
XQueryExecutable xqueryExec = xqueryCompiler
.compile("<result>{"
+ "doc('')/table/rows/row/cell/text()='Foo2'"
+ "}</result>");

XQueryEvaluator xqueryEval = xqueryExec.load();
xqueryEval.setSource(new SAXSource(new InputSource(
new StringReader(tableXml))));

XdmDestination destination = new XdmDestination();

xqueryEval.setDestination(destination);

// Avert your eyes!
xqueryEval.setURIResolver(new URIResolver() {
@Override
public Source resolve(String href, String base) throws TransformerException {
return new StreamSource(new StringReader(tableXml));
}
});

xqueryEval.run();

System.out.println(destination.getXdmNode());

} catch (Exception e) {
e.printStackTrace();
}
}
}

我遇到的问题是 XML 文档的基本 URI。由于它在内存中,因此没有可供引用的基础文档。我知道 XML 将始终是独立的,因此我决定覆盖 URIResolver 以仅传回包装在 Source 类型对象中的 XML。我知道这是错误的,但它有效。如果我不这样做,我会得到一个 Content not allowed in prolog 错误。从错误消息的其余部分来看,它似乎正在尝试将当前目录作为 XML 文件读取。那部分对我来说有点神秘,但我愿意学习!有没有正确的方法来做我想做的事?

最佳答案

如果您想使用 doc('') 访问源文档,那么这就是实现它的方法。但是,如果您编写查询以访问源文档作为上下文项的值,事情就会简单得多。因此,您将查询更改为

"<result>{/table/rows/row/cell='Foo2'}</result>"

您已经使用 setSource() 提供了上下文项,即使您没有使用它,所以这是您需要进行的唯一更改。

(我还从查询中删除了“/text()”,因为直接测试元素的值要好得多——这意味着如果源文档包含注释,您的查询仍然有效)。

关于java - 如何针对字符串中的 XML 运行 XQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com