考虑到以下XML结构,我如何获取/打印与给定xpath匹配的相应DOM结构。
<foo>
<foo1>Foo Test 1</foo1>
<foo2>
<another1>
<test1>Foo Test 2</test1>
</another1>
</foo2>
<foo3>Foo Test 3</foo3>
<foo4>Foo Test 4</foo4>
</foo>
对于xpath /foo/foo2
,输出应该类似于
<another1>
<test1>Foo Test 2</test1>
</another1>
答案 0 :(得分:1)
您无法使用xpath以xml的形式获取DOM结构。使用xpath和evaluate,您将获得DOM节点。你可以从NODESET构造你想要的xml,但是这会很麻烦,因为子节点的数量在感兴趣的元素下增加(这里只有一个子节点another1
- 它是好的)
但另外考虑使用如下的XSLT:
注意:我已经使用xslt作为字符串,如果您的要求只是显示another1
那么简单就可以了,否则您需要创建一个新的.xsl
文件并使用它创建{ {1}}喜欢:StreamSource
new StreamSource( new File("mystylesheet.xsl") )
它的工作方式是transfomer在您的xml上应用XSLT字符串(在上面的代码中用String xslt = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" +
"<xsl:output method=\"xml\" omit-xml-declaration=\"yes\"/>" +
"<xsl:template match=\"/\">" +
"<xsl:copy-of select=\"//foo/foo2/another1\"/>" +
"</xsl:template>" +
"</xsl:stylesheet>";
Transformer transformer = TransformerFactory.newInstance().newTransformer( new StreamSource(new StringReader(xslt)) );
StreamSource xmlSource = new StreamSource( new File( "anotherfoo.xml" ) );
StringWriter sw = new StringWriter();
transformer.transform(xmlSource, new StreamResult(sw) );
System.out.println(sw.toString());
表示)并获取与xpath anotherfoo.xml
到//foo/foo2/another1
匹配的元素。