0

axis2を使用するためにオープンソースのOWL- SAPIhttp://on.cs.unibas.ch/owls-api/を入手しようとしています。リクエストを正しく送信することができましたが、レスポンスに関しては、変換を適用するのに問題があります。私の質問に答えやすくするために、プロジェクトをインポートせずに実行できるスタンドアロンコードを提供しています。DOMSourceを設定するには:

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

Google、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();
    }
4

2 に答える 2

0

Axiom ツリーで JAXP API を使用するために、最初にそれを SAAJ または DOM に変換する必要はありません。Axiom は、JAXP に渡すことができる SAXSource を作成できます。例はここにあります。この例ではjavax.xml.validationAPI を使用していますがjavax.xml.transform、同じように機能します。

この例では、最近の Axiom バージョンで導入されたいくつかの API を使用していますが、この機能はかなり前から存在していることに注意してください。使用している Axiom のバージョンによっては、コードを古い API に適合させる必要があります。getSAXSource特に、 (1.2.13 で導入された)呼び出しの代わりに、org.apache.axiom.om.impl.jaxp.OMSourceオブジェクトを作成して JAXP に渡す必要があります。

于 2012-04-14T11:34:28.803 に答える