繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM