【问题标题】:Retrieve XPath result in Saxonica with XML tag使用 XML 标记在 Saxonica 中检索 XPath 结果
【发布时间】:2020-02-06 11:58:07
【问题描述】:

我正在尝试使用来自 net.sf.saxon 的带有 Saxonica API 的杂项 xpath 查询 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

【问题讨论】:

    标签: java xpath saxon


    【解决方案1】:

    XPath 表达式返回一个节点;然后,您对节点执行的操作取决于调用应用程序代码。如果您调用node.getStringValue(),您将获得XPath 规范中定义的字符串值(即,与在XPath 中的节点上调用fn:string() 相同)。同样,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 表达式本身内调用序列化;这将避免在 Java 代码中使用任何特定于 Saxon 的类和方法。

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多