简体   繁体   English

用xslt转换xml后的Java getNode

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM