[英]Retrieve XPath result in Saxonica with XML tag
我正在尝试使用杂项 xpath 和来自net.sf.saxon 的Saxonica API 查询 XML 文件,但似乎每次查询操作都返回没有 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 内的节点上调用fn:string()
相同)。 类似地, atomize atomize()
方法遵循原子化的 XPath 规范(相当于应用于节点的fn:data()
。)
如果您希望将节点序列化为词法 XML,则有多种实现方式。 如果您要使用 Saxon 的 s9api 接口而不是 JAXP 接口,我会推荐XdmNode.toString()
。 使用 JAXP 接口然后转换为内部 Saxon 类会给您带来两全其美的结果:您会遇到 JAXP 的所有问题(例如弱类型、没有 XPath 2.0 支持)而没有任何好处(跨实现的可移植性)。 但是,如果您更喜欢这样做,那么序列化 Saxon 节点的最简单方法可能是静态方法QueryResult.serialize(NodeInfo)
。 该方法的 3 参数版本使您可以完全控制序列化属性,例如缩进和添加 XML 声明。
使用 XPath 3.1,您还可以通过调用fn:serialize()
在 XPath 表达式本身内调用序列fn:serialize()
; 这将避免在 Java 代码中使用任何特定于 Saxon 的类和方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.