Java 使用XML标记在Saxonica中检索XPath结果
我试图使用net.sf.saxon中的其他XPath和API来查询XML文件,但似乎每次查询操作都返回不带XML标记的结果,而只返回内容。有没有办法做到这一点(直接或变通) 更明确地说: 对于xml文件Java 使用XML标记在Saxonica中检索XPath结果,java,xpath,saxon,Java,Xpath,Saxon,我试图使用net.sf.saxon中的其他XPath和API来查询XML文件,但似乎每次查询操作都返回不带XML标记的结果,而只返回内容。有没有办法做到这一点(直接或变通) 更明确地说: 对于xml文件 <books> <book lang="en"> <nrpages>140</nrpages> <author>J.R.R.Tolkien</author> </book
<books>
<book lang="en">
<nrpages>140</nrpages>
<author>J.R.R.Tolkien</author>
</book>
</books>
我想取回
<book lang="en">
<nrpages>140</nrpages>
<author>J.R.R.Tolkien</author>
</book>
我所尝试的:
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()
相同)。类似地,atomization()
方法遵循用于原子化的XPath规范(相当于应用于节点的fn:data()
)
如果希望将节点序列化为词法XML,可以通过多种方式实现。如果要使用Saxon的s9api接口而不是JAXP接口,我建议使用XdmNode.toString()
。使用JAXP接口,然后强制转换到内部Saxon类,这两个方面都是最糟糕的:JAXP的所有问题(例如,弱类型,不支持XPath2.0)都没有好处(跨实现的可移植性)。但是如果您喜欢这样做,那么序列化Saxon节点的最简单方法可能是静态方法QueryResult.serialize(NodeInfo)
。该方法的3参数版本使您能够完全控制序列化属性,例如缩进和添加XML声明
使用XPath 3.1,还可以通过调用
fn:serialize()
,在XPath表达式本身中调用序列化;这将避免在Java代码中使用任何特定于Saxon的类和方法;然后,您如何处理节点取决于调用应用程序代码。如果调用node.getStringValue()
,将获得XPath规范中定义的字符串值(即,与在XPath中的节点上调用fn:string()
相同)。类似地,atomization()
方法遵循用于原子化的XPath规范(相当于应用于节点的fn:data()
)
如果希望将节点序列化为词法XML,可以通过多种方式实现。如果要使用Saxon的s9api接口而不是JAXP接口,我建议使用XdmNode.toString()
。使用JAXP接口,然后强制转换到内部Saxon类,这两个方面都是最糟糕的:JAXP的所有问题(例如,弱类型,不支持XPath2.0)都没有好处(跨实现的可移植性)。但是如果您喜欢这样做,那么序列化Saxon节点的最简单方法可能是静态方法QueryResult.serialize(NodeInfo)
。该方法的3参数版本使您能够完全控制序列化属性,例如缩进和添加XML声明
使用XPath 3.1,还可以通过调用fn:serialize()
,在XPath表达式本身中调用序列化;这将避免在Java代码中使用任何特定于Saxon的类和方法
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