繁体   English   中英

xs的JAXB XJC代码生成问题:列出日期和dateTime类型

[英]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方法:

http://java.sun.com/javase/6/docs/api/javax/xml/datatype/XMLGregorianCalendar.html#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应该为dateTimedate模式类型生成XmlGregorianCalendar类型的字段。 由您决定哪个是哪个。 xs:stringxs:NMTOKEN都映射到java.lang.String没有什么不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM