2010-07-27 126 views
0

我正在使用xsd有两个<xs:list/>元素。JAXB XJC代码生成问题与xs:列表日期和日期时间类型

<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元素,它不应该这样做。那么我如何区分这两个元素呢?

回答

0

我不知道我是否误解了你,但XJC应为dateTimedate模式类型生成XmlGregorianCalendar类型的字段。你应该知道哪个是哪个;它与映射到java.lang.Stringxs:stringxs:NMTOKEN没有什么不同。

+0

是的,你是对的它产生的XMLGregorianCalendar的两个元素。 其实我也使用这个类的JAXBContext生成XML。我得到dateTime和dateTime xs:list元素的dateTime默认值。 我想这个问题是因为在xs:list的情况下丢失了@XmlSchemaType(name =“date”)注释。我怎样才能解决这个问题?我们有没有这样的JAXB绑定? – harry 2010-07-27 09:29:33

+0

@harry:请编辑您的问题,并添加您所看到的具体示例,以及您认为应该如何操作。 – skaffman 2010-07-27 09:38:55

+0

请现在检查问题,让我知道你是否需要进一步澄清。 – harry 2010-07-27 11:42:59

1

您可以添加注释@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> 
+0

嗨布莱斯 感谢您的意见。但我的主要问题是我不想手动更改JaxB生成的类。对于正常的日期和日期时间;生成的JaxB类具有正确的注解@XmlSchemaType(name =“dateTime”)或@XmlSchemaType(name =“date”)。但是对于xs:list中的相同DataType,不会生成注释。我正在寻找像绑定这样的解决方案,即使对于xs:list也会生成此注释 – harry 2010-07-28 12:33:08