【问题标题】:JAXB: Unmarshalling does not always populate certain classes?JAXB:解组并不总是填充某些类?
【发布时间】:2010-02-22 05:15:41
【问题描述】:

我有一个 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 &gt; 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&lt;IDType.Wrapper&lt;String&gt; )并且编译良好。

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

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

【问题讨论】:

    标签: java xml jaxb xsd


    【解决方案1】:

    不是一个坏主意,但请注意以下几点:根据您的架构,您的“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);
    

    【讨论】:

    • 感谢您的及时回复。我很感激。是的,我确实有一个验证器,这就是我发现它的地方——正如你所说。但是,在调试模式下,解组具有两个实例的 XML 后,如果 IDType 的包装器(即本例中的 DriversLicense 和 SSN),我查看了这些类并注意到它们是确实无人居住。因此,即使生成了 Wrapper 类,在不应该的情况下,解组仍然失败。你有什么想法为什么?在更改 XML 或任何绑定自定义方面有什么建议吗?再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2020-02-28
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多