JAXB + SOAP XML 生成与解析

首先说明一下,SOAP XML 和普通XML之间有什么区别

与SOAP XML 相比 XML 是没有什么固定的格式
而SOAP XML 则有固定的标签组成头部,响应信息,错误信息等
具体可参考 SOAP 语法

现在来说说怎么生成SOAP XML
这是咱们要定义的格式内容,另外还有其它格式的xml在源码中

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.w3.org/">
    <soapenv:Header/>
    <soapenv:Body>
        <web:SubmitContent>
            <pUsername>pUsername</pUsername>
            <pPassword>pPassword</pPassword>
            <pMyOrigin>pMyOrigin</pMyOrigin>
            <pVersion>1.0</pVersion>
            <pContent>
                <![CDATA[<AVS_TRANSACTIONS><VERSION>1.0</VERSION><DATE_CREATED>20120806</DATE_CREATED><RECORDS><RECORD num="1"><USER_NAME>哆啦A梦丶幻想</USER_NAME><USER_AGE>18</USER_AGE><USER_SEX>MAN</USER_SEX><PHONE_NUMBER>1111111111111</PHONE_NUMBER></RECORD></RECORDS></AVS_TRANSACTIONS>]]>
	        </pContent>
 	    </web:SubmitContent>
	</soapenv:Body>
</soapenv:Envelope>

首先是定义,SOAP头部

			// 我们主要需要定义的内容是<soapenv:Body></soapenv:Body>标签下的内容
	        MessageFactory messageFactory = MessageFactory.newInstance();
	        SOAPMessage soapMessage = messageFactory.createMessage();
	        SOAPPart soapPart = soapMessage.getSOAPPart();
	        // SOAP Envelope
	        SOAPEnvelope envelope = soapPart.getEnvelope();
	        // SOAP Header
	        SOAPHeader header = soapMessage.getSOAPHeader();
	        // SOAP Body
	        SOAPBody body = soapMessage.getSOAPBody();
	        // 移除xmlns:SOAP-ENV
	        envelope.removeNamespaceDeclaration(envelope.getPrefix());
	        // 设置前缀,默认为SOAP-ENV
	        envelope.setPrefix(prefix);
	        header.setPrefix(prefix);
	        body.setPrefix(prefix);
	
	        envelope.addNamespaceDeclaration(prefix, "http://www.w3.org/2001/12/soap-envelope");
	        envelope.addNamespaceDeclaration(myNamespace, "http://www.w3.org/");

定义body

// SOAP Body
        SOAPElement soapBodyElem = soapBody.addChildElement("SubmitContent", myNamespace);

        SOAPFactory soapFactory = SOAPFactory.newInstance();

        List<SOAPElement> baseSoapElementList = SoapUtils.baseSoapElement(soapFactory);
        for (SOAPElement soapElement : baseSoapElementList) {
            soapBodyElem.addChildElement(soapElement);
        }

        List<Record> recordList = new ArrayList<>();
        Record record = Record.builder()
                .num("1")
                .userName("哆啦A梦丶幻想")
                .age(18)
                .sex(SexEnums.MAN)
                .phone("1111111111111")
                .build();
        recordList.add(record);
        Transaction transaction = Transaction.of("1.0", "20120806", recordList);
        String test = XmlUtils.objToXml(transaction);


        SOAPElement names = soapFactory.createElement("pContent");
        Document soapBodyDoc = names.getOwnerDocument();
        CDATASection cdata = soapBodyDoc.createCDATASection(test);
        names.appendChild(cdata);

        soapBodyElem.addChildElement(names);
        // 更新soap
        soapMessage.saveChanges();        

解析SOAP XML
这里解析SOAP XML实际上就是将SOAP Body中的节点取出,然后在正常解析(就像解析普通的xml格式)

        Document document = DocumentHelper.parseText(xml);
        // 获取SOAP XML Body的下一个节点
        String beanXml = document.getRootElement().element("Body").element(
                elementName).asXML();
        // XML 正常解析
        JAXBContext jaxbContext = JAXBContext.newInstance(classes);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        return (T) unmarshaller.unmarshal(new StringReader(beanXml));

源码地址:

  1. 国外:https://github.com/DuoLaAMengDianHuanXiang/SoapXml
  2. 国内: https://gitee.com/DLAMDXH/SoapXml

参考博客:
将soap报文(或xml)转换成对象
JAXB(二)——核心注解介绍

如有建议,欢迎指出。

生成SOAP XML可以使用JavaSOAP API来完成,以下是一个简单的示例: ```java // 创建SOAP消息 MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage soapMessage = messageFactory.createMessage(); // 创建SOAP部分 SOAPPart soapPart = soapMessage.getSOAPPart(); // 创建SOAP消息体 SOAPBody soapBody = soapPart.getEnvelope().getBody(); SOAPElement soapElement = soapBody.addChildElement("HelloWorld"); // 添加SOAP消息参数 SOAPElement soapElement1 = soapElement.addChildElement("Name"); soapElement1.addTextNode("张三"); // 将SOAP消息转换为XML字符串 ByteArrayOutputStream out = new ByteArrayOutputStream(); soapMessage.writeTo(out); String xml = new String(out.toByteArray()); // 输出SOAP XML字符串 System.out.println(xml); ``` 将SOAP XML解组为Java对象可以使用JavaJAXB API来完成,以下是一个简单的示例: ```java // 定义Java对象 @XmlRootElement(name = "HelloWorld") @XmlAccessorType(XmlAccessType.FIELD) public class HelloWorld { @XmlElement(name = "Name") private String name; // getter 和 setter 方法 } // 将SOAP XML解析Java对象 ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes()); JAXBContext jaxbContext = JAXBContext.newInstance(HelloWorld.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); HelloWorld helloWorld = (HelloWorld) unmarshaller.unmarshal(in); // 输出Java对象 System.out.println(helloWorld.getName()); ``` 需要注意的是,解析SOAP XML时需要先将SOAP消息部分提取出来,然后再解析Java对象。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值