[英]JAXB XJC code generation issue with xs: list date and dateTime type
我正在使用具有两个<xs:list/>
元素的xsd。
<xs:element name="packorder1" type="DateTimeTypeXsList"/>
<xs:element name="packorder2" type="DateTypeXsList"/>
<xs:simpleType name="DateTimeTypeXsList">
<xs:list itemType="xs:dateTime"/>
</xs:simpleType>
<xs:simpleType name="DateTypeXsList">
<xs:list itemType="xs:date"/>
</xs:simpleType>
对于这些元素,JAXB生成的代码是:
@XmlList
@XmlElement(required = true)
protected List<XMLGregorianCalendar> packorder1;
@XmlList
@XmlElement(required = true)
protected List<XMLGregorianCalendar> packorder2;
生成的代码不包含有关这些元素中的哪个是date
类型以及哪个元素是dateTime
类型的信息。现在,如果我尝试使用此类的jaxbcontext创建xml,它将为packorder1和packorder2创建一个dateTime元素。它不应该这样做。 那么我如何区分这两个元素呢?
您可以在模型中添加@XmlSchemaType批注以控制输出
@XmlList
@XmlElement(required = true)
@XmlSchemaType(name="dateTime")
protected List<XMLGregorianCalendar> packorder1;
@XmlList
@XmlElement(required = true)
@XmlSchemaType(name="date")
protected List<XMLGregorianCalendar> packorder2;
另外,XMLGregorianCalendar知道哪种XML模式类型与其保存的数据相对应,请参阅XMLGregorianCalendar的getXMLSchemaType方法:
然后,JAXB将使用该模式类型来封送文档:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.datatype.XMLGregorianCalendar;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
public Root() {
packorder1 = new ArrayList<XMLGregorianCalendar>();
packorder2 = new ArrayList<XMLGregorianCalendar>();
}
@XmlList
@XmlElement(required = true)
protected List<XMLGregorianCalendar> packorder1;
@XmlList
@XmlElement(required = true)
protected List<XMLGregorianCalendar> packorder2;
public List<XMLGregorianCalendar> getPackorder1() {
return packorder1;
}
public void setPackorder1(List<XMLGregorianCalendar> packorder1) {
this.packorder1 = packorder1;
}
public List<XMLGregorianCalendar> getPackorder2() {
return packorder2;
}
public void setPackorder2(List<XMLGregorianCalendar> packorder2) {
this.packorder2 = packorder2;
}
}
和
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
DatatypeFactory df = DatatypeFactory.newInstance();
XMLGregorianCalendar dateTime1 = df.newXMLGregorianCalendar("2010-07-27T12:34:56");
root.getPackorder1().add(dateTime1);
XMLGregorianCalendar dateTime2 = df.newXMLGregorianCalendar("2010-03-17T01:02:03");
root.getPackorder1().add(dateTime2);
XMLGregorianCalendar date1 = df.newXMLGregorianCalendar("2010-07-27");
root.getPackorder2().add(date1);
XMLGregorianCalendar date2 = df.newXMLGregorianCalendar("2010-03-17");
root.getPackorder2().add(date2);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
将产生:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<packorder1>2010-07-27T12:34:56 2010-03-17T01:02:03</packorder1>
<packorder2>2010-07-27 2010-03-17</packorder2>
</root>
我不确定是否会误解您,但是XJC应该为dateTime
和date
模式类型生成XmlGregorianCalendar
类型的字段。 由您决定哪个是哪个。 xs:string
和xs:NMTOKEN
都映射到java.lang.String
没有什么不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.