以下是您可以如何处理您的使用 cae:
如果您需要映射Envelope
元素
包信息
通常你会使用@XmlSchema
如下。像我所做的那样使用namespace
andelementFormDefault
属性意味着映射到 XML 元素的所有数据,除非另有映射,否则将属于http://www.xxxx.com/ncp/oomr/dto/
命名空间。中指定的信息xmlns
用于 XML 模式生成,尽管一些 JAXB 实现使用它来确定编组时命名空间的首选前缀(请参阅: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes. html ).
@XmlSchema (
namespace="http://www.xxxx.com/ncp/oomr/dto/",
elementFormDefault=XmlNsForm.QUALIFIED,
xmlns = {
@XmlNs(prefix = "env", namespaceURI="http://schemas.xmlsoap.org/soap/envelope/"),
@XmlNs(prefix="whatever", namespaceURI="http://www.xxxx.com/ncp/oomr/dto/")
}
)
package com.one.two;
import javax.xml.bind.annotation.*;
信封
如果在com.one.two
你需要映射到命名空间以外的元素,http://www.xxxx.com/ncp/oomr/dto/
那么你需要在@XmlRootElement
和@XmlElement
注释中指定它。
package com.one.two;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Envelope", namespace="http://schemas.xmlsoap.org/soap/envelope/")
@XmlAccessorType(XmlAccessType.FIELD)
public class Envelope {
@XmlElement(name="Body", namespace="http://schemas.xmlsoap.org/soap/envelope/")
private Body body;
}
了解更多信息
如果您只想映射身体
您可以使用 StAX 解析器来解析消息并前进到有效负载部分并从那里解组:
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
public class UnmarshalDemo {
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource xml = new StreamSource("src/blog/stax/middle/input.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(xml);
xsr.nextTag();
while(!xsr.getLocalName().equals("return")) {
xsr.nextTag();
}
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement<Customer> jb = unmarshaller.unmarshal(xsr, Customer.class);
xsr.close();
}
}
了解更多信息