我正在尝试通过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
XdmNode.toString()
。使用JAXP接口然后转换为内部Saxon类会让您两全其美:您会遇到JAXP的所有问题(例如,弱类型输入,不提供XPath 2.0支持),却没有任何好处(实现之间的可移植性)。但是,如果您更喜欢这样做,那么序列化Saxon节点的最简单方法可能就是静态方法QueryResult.serialize(NodeInfo)
。该方法的3个参数版本使您可以完全控制序列化属性,例如缩进和添加XML声明。使用XPath 3.1,您还可以通过调用fn:serialize()
在XPath表达式本身内调用序列化;这样可以避免在Java代码中使用任何特定于Saxon的类和方法。