2012-04-12 21 views
0

我正在試圖讓開源OWL-S API http://on.cs.unibas.ch/owls-api/使用axis2。我設法正確地發送了請求,但是當涉及到響應時,我無法對其應用轉換。爲了讓我的問題更容易回答,我提供了一些獨立的代碼,這些代碼應該在不需要導入項目的情況下運行。要設置DOMSource的:將xalan java轉換應用於axis2對象?

String xmlString = "<ns1:countResponse xmlns:ns1=\"http://www.test.de/pill-counter\"><ns1:value>0</ns1:value><ns1:value>0</ns1:value><ns1:value>1</ns1:value><ns1:value>0</ns1:value><ns1:value>0</ns1:value><ns1:value>0</ns1:value></ns1:countResponse>"; 
    ByteArrayInputStream xmlStream = new ByteArrayInputStream(xmlString.getBytes()); 
    OMElement test = null; 
    try { 
     StAXBuilder builder = new StAXOMBuilder(xmlStream); 
     test = (OMElement) builder.getDocument().getChildren().next(); 

    } catch (XMLStreamException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    OMElement documentElement = null; 
     try { 
     documentElement = AXIOMUtil.stringToOM(DOOMAbstractFactory.getOMFactory(), xmlString); 
    } catch (XMLStreamException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 

    SAAJConverterFactory convFactory = (SAAJConverterFactory) FactoryRegistry.getFactory(org.apache.axis2.jaxws.message.factory.SAAJConverterFactory.class); 
    SAAJConverter conv = convFactory.getSAAJConverter(); 


    //Create soap 1.1 message 
    SOAPMessage msg = MessageFactory.newInstance().createMessage(); 
    SOAPPart sp = msg.getSOAPPart(); 
    SOAPEnvelope se = sp.getEnvelope(); 
    SOAPBody soapBody = se.getBody(); 
    javax.xml.soap.SOAPFactory soapFactory = javax.xml.soap.SOAPFactory.newInstance(); 
    response = conv.toSAAJ(documentElement, soapBody, soapFactory); 
    Node root = response; 

而現在應用轉型:

Transformer transformer = null; 
    try { 
     transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new StringReader("<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:ns1=\"http://www.test.de/pill-counter\">\n\n\t<xsl:template match=\"/\">\n\t\t<xsl:value-of select=\"sum(*/ns1:value)\" />\n\t</xsl:template>\n</xsl:stylesheet>"))); 
    } catch (TransformerConfigurationException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } catch (TransformerFactoryConfigurationError e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 
    try { 
     transformer.transform(new DOMSource(root), new StreamResult(System.out)); 
    } catch (TransformerException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

運行此代碼的結果是一個NullPointerException異常。

SystemId unknown; Line num.0; Column num.0; java.lang.NullPointerException 

我試圖尋找一個解決方案,在谷歌的的Xalan-J的郵件列表,並在這個網站沒有運氣這個問題。我也嘗試了其他幾種編碼方法,但沒有運氣。任何人的想法?

我發現另一種方式產生從頭文檔得到這個工作:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 
    dbf.setValidating(false); 
    DocumentBuilder db = null; 
    try { 
     db = dbf.newDocumentBuilder(); 
    } catch (ParserConfigurationException e3) { 
     // TODO Auto-generated catch block 
     e3.printStackTrace(); 
    }   
    InputSource is = new InputSource(new StringReader(documentElement.toString())); 
    Document document = null; 
    try{ 
     document=db.parse(is); 
    } catch (SAXException e3) { 
     // TODO Auto-generated catch block 
     e3.printStackTrace(); 
    } catch (IOException e3) { 
     // TODO Auto-generated catch block 
     e3.printStackTrace(); 
    } 
+0

您可以添加有關您正在使用的Axis2和Axiom版本的信息嗎? – 2012-04-13 15:32:18

+0

嗨,我使用最新的軸版本axis2-1.6.1和公理1.2.12,任何幫助將不勝感激 – m1416 2012-04-17 10:21:33

+0

我編輯我的答案,使其適用於公理1.2.12。 – 2012-04-17 21:51:27

回答

0

要在Axiom樹上使用JAXP API,您無需首先將其轉換爲SAAJ或DOM。 Axiom能夠創建一個可以傳遞給JAXP的SAXSource。可以找到一個例子here。該示例使用javax.xml.validation API,但javax.xml.transform的工作方式相同。

請注意,該示例使用了近期Axiom版本中引入的一些API,但該功能已存在很長一段時間。根據您使用的Axiom版本,代碼需要適應舊的API。特別是,不需要調用getSAXSource(在1.2.13中介紹),您需要構造一個org.apache.axiom.om.impl.jaxp.OMSource對象並將其傳遞給JAXP。

+0

嗨,你是正確的代碼工作,沒有例外,如果我像這樣調用變壓器:'transformer.transform(new OMSource(documentElement),new StreamResult (System.out));'我更靠近一步,但輸出不是我期望的那樣**只是** <?xml version =「1.0」encoding =「UTF-8」?> 1 ** – m1416 2012-04-18 15:29:03

+0

與正確的輸出:** <?xml version =「1.0」encoding =「UTF-8」?> 001000 ** – m1416 2012-04-18 15:36:05

+0

我使用生成正確輸出的代碼對原始問題進行了編輯。通過AXIOM API,它說SAX內容處理程序必須知道ns前綴的名稱空間映射。名稱空間映射是由AXIOM自動添加的,但也許有些東西我仍然缺少讓這個工作。非常感謝您爲此提供的進一步幫助。 – m1416 2012-04-18 15:46:14

0

你有沒有考慮過使用的WSDL2Java構建存根,而直接使用低級別的API?這將讓你輕鬆地操縱java中的響應。在這種情況下使用xslt似乎是一種不尋常的方法。

+0

我使用的代碼的工作方式我堅持低級API – m1416 2012-04-17 10:22:33