gpt4 book ai didi

java - 使用 XML 标记在 Saxonica 中检索 XPath 结果

转载 作者:行者123 更新时间:2023-12-02 01:05:31 24 4
gpt4 key购买 nike

我正在尝试使用 Saxonica 的各种 xpath 来查询 XML 文件来自 net.sf.saxon 的 API,但似乎每次查询操作都返回没有 xml 标记的结果 - 只有内容。有没有办法做到这一点(直接或解决方法)?

更明确地说:

对于 xml 文件

<books>
<book lang="en">
<nrpages>140</nrpages>
<author>J.R.R.Tolkien</author>
</book>
</books>

和 xpath

//book

我想找回

<book lang="en">
<nrpages>140</nrpages>
<author>J.R.R.Tolkien</author>
</book>

而不是

140
J.R.R.Tolkien

我尝试过的:

XPathFactory factory = new XPathFactoryImpl();
XPathExpression compiledXPath = factory.newXPath().compile(xPathExpression);
TinyNodeImpl nodeItem = (TinyNodeImpl) compiledXPath.evaluate(new InputSource(filename), XPathConstants.NODE);
nodeItem.atomize(); // brings only the content
nodeItem.getStrinValue(); // brings only the content

最佳答案

XPath 表达式返回一个节点;然后,您对该节点执行的操作取决于调用应用程序代码。如果调用node.getStringValue(),您将获得 XPath 规范中定义的字符串值(即,与在XPath 中的节点)。同样,atomize() 方法遵循原子化的 XPath 规范(相当于应用于节点的fn:data()。)

如果您希望将节点序列化为词法 XML,有多种方法可以实现。如果您要使用 Saxon 的 s9api 接口(interface)而不是 JAXP 接口(interface),我会推荐 XdmNode.toString()。使用 JAXP 接口(interface),然后转换为内部 Saxon 类会给您带来两全其美的结果:您会遇到 JAXP 的所有问题(例如,弱类型、不支持 XPath 2.0),但没有任何好处(跨实现的可移植性)。但如果您更喜欢这样做,那么序列化 Saxon 节点的最简单方法可能是静态方法 QueryResult.serialize(NodeInfo)。该方法的 3 参数版本使您可以完全控制序列化属性,例如缩进和添加 XML 声明。

使用 XPath 3.1,您还可以通过调用 fn:serialize() 在 XPath 表达式本身内调用序列化;这将避免在 Java 代码中使用任何特定于 Saxon 的类和方法。

关于java - 使用 XML 标记在 Saxonica 中检索 XPath 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60094474/

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