2014-02-24 169 views
0

我需要問我怎樣才能得到xml的節點,然後用xslt使用java轉換工廠轉換xml文件。用xslt轉換xml之後的Java getNode

什麼時候沒有java變換我的文件看起來像我需要。但是當我使用java轉換時,它看起來像xslt不會更改任何東西,只是刪除節點並以純文本格式返回everthing。

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()); 

任何人都可以幫助我嗎?

/* 新的問題* */ 我換到DOMResult,但現在我得到空指針異常。在以下行中: transformer.transform(new DOMSource(doc.getDocumentElement()),outputStream);

我想在可以處於org.apache.xalan.transformer問題用XSLT

顯示java.lang.NullPointerException 在org.apache.xalan.transformer.TransformerImpl.createSerializationHandler(TransformerImpl.java:1223) .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.bizt alk.tests.suppliers.invoiceimport.request.Soap_SerialNumber_ACME.Run_Soap_SerialNumber_ACME(Soap_SerialNumber_ACME.java:35) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(來源不明) 在陽光下。 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.runners.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) 在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 在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。在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。在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests()中運行(JUnit4TestReference.java:50) 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)

如果運行更迭我在控制檯中看到這一點:

線#0;列#0; org.w3c.dom.DOMException:HIERARCHY_REQUEST_ERR:嘗試插入不允許的節點。

,並得到公正的XML版本和編碼

回答

0

不要使用StreamResult。改爲使用DOMResult,這會將轉換輸出保存到內存中的新DOM樹中。 DOMResult#getNode()將返回轉換輸出的文檔節點。

0

將變換方法中的第一個參數更改爲StreamSource。

transformer.transform(new StreamSource(new java.io.File("path_to_xml")), new StreamResult(outputStream)); 

我用你的代碼片段,除了上述行變換,它工作正常(我的樣本XML和XSL文件)。