对axis2对象应用XalanJava转换?

对axis2对象应用XalanJava转换?,java,axis2,xalan,Java,Axis2,Xalan,我打算让开源OWL-SAPI使用axis2。我已经成功地将请求正确发送,但是当涉及到响应时,我很难对其应用转换。为了使我的问题更容易回答,我提供了一些独立的代码,这些代码应该在不导入项目的情况下运行。要设置DOMSource,请执行以下操作: String xmlString = "<ns1:countResponse xmlns:ns1=\"http://www.test.de/pill-counter\"><ns1:value>0</ns1:value>&

我打算让开源OWL-SAPI使用axis2。我已经成功地将请求正确发送,但是当涉及到响应时,我很难对其应用转换。为了使我的问题更容易回答,我提供了一些独立的代码,这些代码应该在不导入项目的情况下运行。要设置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;
我曾尝试在谷歌、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();
    }

您是否考虑过使用wsdl2java来构造存根,而不是直接使用低级API?这将使您可以轻松地在java中操纵响应。在这种情况下,使用xslt似乎是一种不同寻常的方法。

要在Axiom树上使用JAXP API,不需要首先将其转换为SAAJ或DOM。Axiom能够创建可以传递给JAXP的SAXSource。可以找到一个例子。该示例使用
javax.xml.validation
API,但对于
javax.xml.transform
它的工作方式相同


请注意,该示例使用了最近Axiom版本中引入的一些API,但该特性已经存在了相当长的一段时间。根据您使用的Axiom版本,代码需要适应较旧的API。特别是,您需要构造一个
org.apache.axiom.om.impl.jaxp.OMSource
对象并将其传递给jaxp,而不是调用
getSAXSource
(它是在1.2.13中引入的),您可以添加有关正在使用的Axis2和axiom版本的信息吗,我使用的是最新版本的axis2-1.6.1和axiom 1.2.12,如果有任何帮助,我都会非常感激。我编辑了我的答案,使其适用于axiom 1.2.12。我使用的代码的工作方式我一直使用低级APHI,你是对的。如果我这样调用transformer,代码毫无例外地工作:
transformer.transform(new OMSource(documentElement),新的StreamResult(System.out))
我更接近了一步,但输出不是我所期望的,与正确的输出相比,它只是1:001000我用生成正确输出的代码对原始问题进行了编辑。通过AXIOM API,它说SAX内容处理程序必须知道ns前缀的命名空间映射。命名空间映射ping是由AXIOM自动添加的,但可能我仍然缺少一些东西来实现它。非常感谢您在这方面的进一步帮助。我不明白。鉴于您的样式表基本上计算sum(*/ns1:value),正确的结果是“1”而不是“001000”。无论如何,使用这两种方法(AXIOM或DOM)我得到了相同的结果,即“1”。你确定你在两个测试中使用了相同的样式表吗?我在两个测试中使用了相同的样式表,你是对的。可能我的问题表述错误。如果调用
transformer.transform(new-DOMSource(document.getDocumentElement()),则DOM的结果不同(new-StreamResult(System.out))
而不仅仅是
transformer.transform(新的DOMSource(document),新的StreamResult(System.out));
有没有办法在AXIOM中获取documentElement?我尝试了
transform.transform(新的OMSource(documentElement.getBuilder().getDocumentElement()),新的StreamResult(System.out));
什么都没有。
SystemId unknown; Line num.0; Column num.0; java.lang.NullPointerException
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();
    }