[英]Java getNode after transforming xml with xslt
I need to ask how i can get nodes of xml atfer transforming xml file with xslt using java transform factory. 我需要问一下如何使用Java转换工厂使用xslt转换xml文件来获取xml节点。
when do transform without java my document looks like i need. 什么时候不使用Java进行转换,我的文档就好像我需要的。 But when i transform using java it looks like xslt don't change anything just remove nodes and return everthing in plain text.
但是,当我使用Java进行转换时,看起来xslt不会进行任何更改,只是删除节点并以纯文本形式返回所有内容。
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
db.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
return null;
}
});
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource("pathtoxsl"));
transformer.transform(new DOMSource(doc.getDocumentElement()), new StreamResult(outputStream));
System.out.println(outputStream.toString());
Can anyone help my? 谁能帮我吗?
/ * new problem * * / i CHANGE to DOMResult but now i get null pointer exception. / * 新问题* * / /我更改为DOMResult,但是现在我得到了空指针异常。 in the following line: transformer.transform(new DOMSource(doc.getDocumentElement()), outputStream);
在以下行中:Transformer.transform(new DOMSource(doc.getDocumentElement()),outputStream);
I suppose in can be problem with xslt 我想xslt可能有问题
java.lang.NullPointerException at org.apache.xalan.transformer.TransformerImpl.createSerializationHandler(TransformerImpl.java:1223) at org.apache.xalan.transformer.TransformerImpl.createSerializationHandler(TransformerImpl.java:1060) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1268) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1251) at com.atea.biztalk.tests.suppliers.invoiceimport.request.Requests.transformXML(Requests.java:166) at com.atea.biztalk.tests.suppliers.invoiceimport.request.Soap_SerialNumber_ACME.Run_Soap_SerialNumber_ACME(Soap_SerialNumber_ACME.java:35) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.ru org.apache.xalan.java.10处的org.apache.xalan.transformer.TransformerImpl.createSerializationHandler(TransformerImpl.java:1223)处的java.lang.NullPointerException org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1251)的transformerImpl.transform(TransformerImpl.java:1268)在com.atea.biztalk.tests.suppliers.invoiceimport.request.Requests.transformXML(在com.atea.biztalk.tests.suppliers.invoiceimport.request.Soap_SerialNumber_ACME。在sun.reflect.DelegatingMethodAccessorImpl.invoke(在Java.lang.reflect.Method.invoke(在Unorge Source)在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:47 ),网址为org.junit.internal.ru nners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.
位于org.junit.runners.model.FrameworkMethod.invoke的nners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod。 java:17)org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner .java:50),位于org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:238),位于org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:63),位于org.junit.runners.ParentRunner。在org.junit.runners.ParentRunner.access处$ 000(ParentRunner.java:53)在org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)在org.junit.runners处的runChildren(ParentRunner.java:236) org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)上的.ParentRunner.run(ParentRunner.java:309),位于org.eclipse.jdt.internal.junit.runner上的。 TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)的TestExecution.run(TestExecution.java:38)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)上的org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java: 197)
if run succes i get in console this: 如果运行成功,我进入控制台:
Line #0; 第0行; Column #0;
列#0; org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted.
org.w3c.dom.DOMException:HIERARCHY_REQUEST_ERR:试图在不允许的节点上插入节点。
and get just xml version and encoding 并获取xml版本和编码
Don't use a StreamResult
. 不要使用
StreamResult
。 Use a DOMResult
instead, which will save the transformation output into a new DOM tree in memory. 请改用
DOMResult
,它将转换输出保存到内存中的新DOM树中。 DOMResult#getNode()
will return the document node of the transformed output. DOMResult#getNode()
将返回转换后的输出的文档节点。
Change the first parameter in transform method to StreamSource. 将转换方法中的第一个参数更改为StreamSource。
transformer.transform(new StreamSource(new java.io.File("path_to_xml")), new StreamResult(outputStream));
I used your code snippet except for the above line for the transform and it works fine (with my sample xml and xsl files). 除了上面的代码行,我使用了您的代码段进行转换,并且工作正常(使用我的示例xml和xsl文件)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.