注意:
Ilya给出的答案有效,但不能保证在所有JAXB实现中甚至在单个JAXB实现的版本中都有效。
@XmlElements当决定要编组哪个元素取决于值的类型时,该注释很有用(请参阅:http : //blog.bdoughan.com/2010/10/jaxb-and-xsd-
choice-xmlelements.html)。在您的用例中,
ResponseCode和
ResultCode元素都对应于type
String,解组总是可以正常工作,但是要输出哪个元素是任意的。一些JAXB Impls可能有最后指定的获胜者,但其他人可能很容易获得第一个获胜者。
您可以利用进行以下 *** 作
@XmlElementRef。Java模型
ResponseAPI
我们将
responseCode属性从type
更改
String为
JAXBElement<String>。将
JAXBElement允许我们存储元素名称和值。
import javax.xml.bind.JAXBElement;import javax.xml.bind.annotation.*;@XmlRootElement@XmlAccessorType(XmlAccessType.FIELD)public class ResponseAPI{ @XmlElementRefs({ @XmlElementRef(name = "ResponseCode"), @XmlElementRef(name = "ResultCode") }) private JAXBElement<String> responseCode; public JAXBElement<String> getResponseCode() { return responseCode; } public void setResponseCode(JAXBElement<String> responseCode) { this.responseCode = responseCode; }}
对象工厂
@XmlElementRef我们在
ResponseAPI类中使用的注释对应于用
@XmlElementDecl注释的类的注释
@XmlRegistry。传统上称为此类,
ObjectFactory但您可以根据需要调用它。
示范代码import javax.xml.bind.JAXBElement;import javax.xml.bind.annotation.*;import javax.xml.namespace.QName;@XmlRegistrypublic class ObjectFactory { @XmlElementDecl(name="ResponseCode") public JAXBElement<String> createResponseCode(String string) { return new JAXBElement<String>(new QName("ResponseCode"), String.class, string); } @XmlElementDecl(name="ResultCode") public JAXBElement<String> createResultCode(String string) { return new JAXBElement<String>(new QName("ResultCode"), String.class, string); }}
input.xml
<responseAPI> <ResponseCode>ABC</ResponseCode></responseAPI>
演示版
创建时,
JAXBContext我们需要确保我们包括包含
@XmlElementDecl批注的类。
import java.io.File;import javax.xml.bind.*;public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(ResponseAPI.class, ObjectFactory.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); File xml = new File("Scratch/src2/forum24554789/input.xml"); ResponseAPI responseAPI = (ResponseAPI) unmarshaller.unmarshal(xml); ObjectFactory objectFactory = new ObjectFactory(); String responseCode = responseAPI.getResponseCode().getValue(); JAXBElement<String> resultCodeJAXBElement = objectFactory.createResultCode(responseCode); responseAPI.setResponseCode(resultCodeJAXBElement); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(responseAPI, System.out); }}
输出量
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><responseAPI> <ResultCode>ABC</ResultCode></responseAPI>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)