JAXB:Unmarshalling并不总是填充某些类?

时间:2010-02-22 05:15:42

标签: java xml jaxb xsd

我有一个JAXB类生成问题,我希望得到一些帮助。这是我的问题来源的XML部分......

<xs:complexType name="IDType"> 
<xs:choice minOccurs="0" maxOccurs="2"> 
  <xs:element name="DriversLicense"    minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="SSN"        minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="CompanyID"       minOccurs="0" maxOccurs="1" type="an..35" /> 
  </xs:choice> 
</xs:complexType> 
<xs:simpleType name="an..35"> 
  <xs:restriction base="an"> 
    <xs:maxLength value="35" /> 
  </xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="an"> 
   <xs:restriction base="xs:string"> 
     <xs:pattern value="[ !-~]*" /> 
   </xs:restriction> 
</xs:simpleType>

...现在这将生成JAXBElement类型,因为choice带有maxOccurs > 1。我想避免这些,所以我通过修改代码使用“Wrapper”元素并将maxOccurs移动到序列标记,如下所示...

<xs:complexType name="IDType"> 
<xs:sequence maxOccurs="2"> 
  <xs:element name=Wrapper>
  <xs:complexType>
  <xs:choice> 
  <xs:element name="DriversLicense"    minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="SSN"        minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="CompanyID"       minOccurs="0" maxOccurs="1" type="an..35" /> 
  </xs:choice>
  </xs:complexType>
  </xs:element>
</xs:sequence> 
</xs:complexType>

<xs:simpleType name="an..35"> 
  <xs:restriction base="an"> 
    <xs:maxLength value="35" /> 
  </xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="an"> 
   <xs:restriction base="xs:string"> 
     <xs:pattern value="[ !-~]*" /> 
   </xs:restriction> 
</xs:simpleType> 

对于类生成,看起来效果很好 - 将JAXB元素替换为包装器列表String(即List<IDType.Wrapper<String>)并编译好。

但是,当我将实际的XML数据解组到生成的类中时,包装类中的数据不会被填充 - 但JAXB不会抛出异常。

我的问题是:我是否需要以不同的方式更改架构才能使其工作?或者我可以添加/更改/删除生成的代码或注释吗?

1 个答案:

答案 0 :(得分:3)

不是一个坏主意,但请注意以下几点:根据您的架构,您的“Wrapper”元素没有内容是完全合法的。它包含可选项的选择。

其次,您可能没有进行架构验证;如果您的文件被破坏,JAXB不会抱怨。如果要打开模式验证,请获取Unmarshaller并初始化如下:

 unmarshaller.setValidating(true);
 SchemaFactory sf = SchemaFactory.newInstance(
    javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
 Schema schema = sf.newSchema(new File("my-schema.xsd"));
 unmarshaller.setSchema(schema);