当前位置: 首页 > 知识库问答 >
问题:

如果名称空间声明在SOAP信封上,如何使用JAXB解组SOAP响应?

锺离宸
2023-03-14

只有在soap信封已被移除的情况下,JAXB才能解组XML。然而,我试图解组的SOAP响应在SOAP信封上有其名称空间声明。如果删除soap信封,名称空间声明也将被删除。因此,标签的前缀将指无。这会导致JAXB抛出错误。如果在SOAP信封上声明了名称空间,如何使用JAXB对SOAP响应进行解组?

我需要解组的XML的类似示例如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://example.com/">
    <soapenv:Body>
        <ns:getNumberResponse>
            <number>123456789</number>
        </ns:getNumberResponse>
    </soapenv:Body>
</soapenv:Envelope>

如果我拿掉肥皂信封,会发生这样的事情:

<ns:getNumberResponse>
    <number>123456789</number>
</ns:getNumberResponse>

如果我移除soap信封,名称空间声明也将消失。JAXB将无法解组上述xml,因为前缀“ns”的名称空间定义丢失了。因此,它将返回< code >,元素“ns:getNumberResponse”的前缀“ns”未绑定。错误消息。我如何修理它?

请注意,我使用的是JDK 1.5版。我不确定在JDK 1.6中是否有解决这个问题的方法。我能够使用JAXB,因为我下载了使用JAXB所需的jar。

共有2个答案

羊舌勇
2023-03-14

您可以使用 DOM 解析器解析整个 SOAP 消息,该解析器能够在解析时解析所有命名空间。然后从生成的 DOM 树中提取所需的元素,并将其传递给取消元组。

东德莫

package forum11465653;

import java.io.File;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.*;

public class DomDemo {

    public static void main(String[] args) throws Exception{
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document d = db.parse(new File("src/forum11465653/input.xml"));
        Node getNumberResponseElt = d.getElementsByTagNameNS("http://example.com/", "getNumberResponse").item(0);

        JAXBContext jc = JAXBContext.newInstance(Response.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        JAXBElement<Response> je = unmarshaller.unmarshal(new DOMSource(getNumberResponseElt), Response.class);
        System.out.println(je.getName());
        System.out.println(je.getValue());
    }

}

输出

{http://example.com/}getNumberResponse
forum11465653.Response@19632847
周和歌
2023-03-14

您可以使用StAX解析器解析SOAP消息,然后将< code>XMLStreamReader推进到< code>getNumberResponse元素,并使用接受类参数的unmarshal方法。Java SE 6中包含一个StAX解析器,但是您需要为Java SE 5下载一个。Woodstox是一个流行的StAX解析器。

响应

package forum11465653;

public class Response {

    private long number;

    public long getNumber() {
        return number;
    }

    public void setNumber(long number) {
        this.number = number;
    }

}

演示

< code>XMLStreamReader有一个< code>NamespaceContext。< code>NamespaceContext知道当前级别的所有活动命名空间声明。您的JAXB (JSR-222)实现将能够利用这一点来获取必要的信息。

package forum11465653;

import java.io.FileReader;
import javax.xml.bind.*;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception{
        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("src/forum11465653/input.xml"));
        xsr.nextTag(); // Advance to Envelope tag
        xsr.nextTag(); // Advance to Body tag
        xsr.nextTag(); // Advance to getNumberResponse tag
        System.out.println(xsr.getNamespaceContext().getNamespaceURI("ns"));

        JAXBContext jc = JAXBContext.newInstance(Response.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        JAXBElement<Response> je = unmarshaller.unmarshal(xsr, Response.class);
        System.out.println(je.getName());
        System.out.println(je.getValue());
    }

}

输出

http://example.com/
{http://example.com/}getNumberResponse
forum11465653.Response@781f6226
 类似资料:
  • 问题内容: 如果已删除肥皂信封,JAXB只能解组XML。但是,我要解组的SOAP响应在soap信封上有其名称空间声明。如果我删除肥皂信封,则名称空间声明也将被删除。因此,标签的前缀将不涉及任何前缀。这将导致JAXB引发错误。如果在SOAP信封上声明了名称空间,如何使用JAXB解组SOAP响应? 我需要解组的XML的类似示例如下: 如果我取下肥皂信封,会发生以下情况: 如果删除了肥皂信封,则名称空间

  • 我试图使用jaxb解组一个soap响应。 我尝试使用以下代码查找根元素 这是我的样本回复 我能够获取对象,但当我尝试访问中的时,由于前缀 有人能帮我脱身吗? 更新:有人能帮我吗? 我使用stax xml解析器解析为,但我将其中的所有值都视为null。

  • 我有一个正在构建的用于访问Web服务的客户端。我正在使用一些JAXB生成的类(Netbean 6.9)来散集我的xml数据。 当试图从这个Web服务解组InputStream响应时,我会遇到意外的元素错误,如果我将响应保存到文件中,我也会遇到同样的意外元素错误。 使用保存到文件中的数据,我可以进入并删除SOAP标签(信封、正文、标头),然后毫无问题地运行解组。 我还没有真正找到一种方法让未婚夫忽略

  • 问题内容: 如何在JavaScript中创建名称空间,以使我的对象和函数不会被其他同名对象和函数覆盖?我使用了以下内容: 有没有更优雅或更简洁的方法? 问题答案: 我喜欢这个:

  • 我在编写一个SOAP/XML客户机与一家名为Domainbox的公司提供的API对话时遇到了问题。我正在使用SOAP::Lite模块/库用Perl编写客户机。我收到以下错误信息: 可能的SOAP版本不匹配:信封命名空间http://schemas.xmlsoap.org/soap/envelope/是意外的。期待http://www.w3.org/2003/05/soap-envelope. 这是

  • 我在名称空间方面有问题。我需要从一个公共api (Prestashop)解组。该api使用xml作为xlink类型,如下所示: 每种产品的 API 为: 我为每个XML生成了两个包含pojo类的包。我想从产品列表中获取给定id的任何产品的属性。 我有一个产品,其中包含@XMLSchema命名空间,但这个命名空间仅针对一个路径是静态的。我知道这不是这样做的方法。 下面,我的客户类。 这里有代码:ht