Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XML标记在Saxonica中检索XPath结果_Java_Xpath_Saxon - Fatal编程技术网

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

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

我试图使用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>
我所尝试的:

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