問題描述
我正在使用 JAXB 從 SOAP 響應中解析 xml 元素.我已經為 xml 元素定義了 POJO 類.我已經測試了沒有命名空間的 pojo 類,并且前綴它的工作正常.雖然當我嘗試使用命名空間和前綴解析時遇到以下異常.要求是解析來自 SOAPMessage 對象的輸入
I am using JAXB to parse xml elements from the SOAP response. I have defined POJO classes for the xml elements. I have tested pojo classes without namespace and prefix its working fine .Though when i am trying to parse with namespaces and prefix facing the following exception.Requirement is to parse the input from SOAPMessage Object
javax.xml.bind.UnmarshalException:意外元素(uri:http://schemas.xmlsoap.org/soap/envelope/",本地:信封").預期的元素是 <{}Envelope>
嘗試通過為 package-info.java 中的包創建 @XMLSchema 并將此文件定位在包文件夾中來修復.有人可以指導我繼續前進嗎?
Tried to fix by creating @XMLSchema for the package in package-info.java and located this file in package folder.Can any one guide me to move forward?
推薦這篇文章但對我沒有幫助.
Referred this posts but didn help me .
已XMLSchema
@javax.xml.bind.annotation.XmlSchema (
xmlns = { @javax.xml.bind.annotation.XmlNs(prefix = "env",
namespaceURI="http://schemas.xmlsoap.org/soap/envelope/"),
@javax.xml.bind.annotation.XmlNs(prefix="ns3", namespaceURI="http://www.xxxx.com/ncp/oomr/dto/")
}
)
package com.one.two;
提前致謝
推薦答案
這可以在不使用標準 SOAPMessage 類修改生成的 JAXB 代碼的情況下完成.我寫了關于這個 here 和 這里
This can be done without modifying the generated JAXB code using standard SOAPMessage class. I wrote about this here and here
這有點繁瑣,但可以正常工作.
It's a little fiddly but works correctly.
Farm farm = new Farm();
farm.getHorse().add(new Horse());
farm.getHorse().get(0).setName("glue factory");
farm.getHorse().get(0).setHeight(BigInteger.valueOf(123));
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Marshaller marshaller = JAXBContext.newInstance(Farm.class).createMarshaller();
marshaller.marshal(farm, document);
SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
soapMessage.getSOAPBody().addDocument(document);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
soapMessage.writeTo(outputStream);
String output = new String(outputStream.toByteArray());
解組
String example =
"<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header /><soapenv:Body><ns2:farm xmlns:ns2="http://adamish.com/example/farm"><horse height="123" name="glue factory"/></ns2:farm></soapenv:Body></soapenv:Envelope>";
SOAPMessage message = MessageFactory.newInstance().createMessage(null,
new ByteArrayInputStream(example.getBytes()));
Unmarshaller unmarshaller = JAXBContext.newInstance(Farm.class).createUnmarshaller();
Farm farm = (Farm)unmarshaller.unmarshal(message.getSOAPBody().extractContentAsDocument());
這篇關于使用名稱空間和前綴解組 JAXB的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!