在今天之前我尚未用過代碼解析過SOAP報文,更別提轉成JAVA對象了,今天的任務中報文這個模樣的,(爲防止數據信息,如下數據我故意打亂了防止泄露什麼信息.)html
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="urn:WSSOP"> <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <ns2:CallWSSOP> <objInputData> <m-strOrderID>2019123041123509590670</m-strOrderID> <m-strSerialNumber>85213365571107</m-strSerialNumber> <nPriority>0</nPriority> <m-strSwitchid>C123L21231302</m-strSwitchid> <m-vServList> <m-strServName>YYH1232</m-strServName> </m-vServList> <m-vVarList> <m-strName>G012302</m-strName> <m-strValue>455020096628454</m-strValue> </m-vVarList> <m-vVarList> <m-strName>G123004</m-strName> <m-strValue>85361235571107</m-strValue> </m-vVarList> <m-vVarList> <m-strName>G123071</m-strName> <m-strValue>0085123265571107</m-strValue> </m-vVarList> </objInputData> </ns2:CallWSSOP> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
上面是使用POSTMAN美化以後的報文樣子,最開始的報文模樣是這樣的java
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="urn:WSSOP"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><ns2:CallWSSOP><objInputData><m-strOrderID>2019041509590670</m-strOrderID><m-strSerialNumber>85365571107</m-strSerialNumber><nPriority>0</nPriority><m-strSwitchid>CL02</m-strSwitchid><m-vServList><m-strServName>YYH2</m-strServName></m-vServList><m-vVarList><m-strName>G002</m-strName><m-strValue>455020096628454</m-strValue></m-vVarList><m-vVarList><m-strName>G004</m-strName><m-strValue>85365571107</m-strValue></m-vVarList><m-vVarList><m-strName>G071</m-strName><m-strValue>0085265571107</m-strValue></m-vVarList></objInputData></ns2:CallWSSOP></SOAP-ENV:Body></SOAP-ENV:Envelope>
美化報文不是爲了別人,是爲了本身看起來方便一點點,有助於瞭解對象結構。 美化工具可能不少,手邊的工具可能就POSTMAN,就以這個爲例了,相信人手都會裝有一個。api
在POSTMAN中隨意打開一個,Body裏面貼上原始報文,而後調成XML, 點擊Beauty便可美化報文.oracle
因爲組長髮給個人文檔裏面沒有這個SOAP的地址,只有一份接口參數說明以及wsdl文件,接口地址暫時還沒給我,因此咱們利用wsdl文件生成java實體類,soap的url也是同樣的效果.工具
如下是操做步驟,將wsdl文件放到工程的某個文件目錄下,右擊 WebService—>Generate Java Code from wsdl (這裏指定wsdl路徑應該是同樣的效果)—> 選定 Axis2 和 JaxB,以及生成的目錄便可,可是每次生成位置稍有不對,手動移下就好了,這樣就生成了Java對象.ui
不知道爲何按照StackOverFlow啊、博客方法,解析總會存在問題;而別人好像又可以解析成功,可能每一個人的報文不同的緣由,https://stackoverflow.com/questions/19395400/jaxb-unmarshall-with-namespaces-and-prefix . url
按照別人寫的直接獲取SoapBody在使用extractContentAsDocument方法,就可以解析成功,而到了我這裏解析下來java實體類中全部屬性都是空的,因而我就想到的上面的方式,這樣加入SoapBody中存在多個屬性,好比和CallWSSOP同級的java類,也可以解析出來.spa
另外我嘗試了很久去利用@XmlNs發現,這個註解好像根本不起做用,這裏面待研究的好多,可是之後碰到像我遇到這麼複雜的報文,解析方式按照上面來就能夠啦.code
附上Marsharl API官網一份,https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Marshaller.htmlxml