相当简单的XSD生成ObjectFactory在JAXBElement中包装根元素类

时间:2016-11-08 05:23:25

标签: java xml xsd jaxb xjc

我很难理解为什么XJC会生成一个ObjectFactory来包装与JAXBElement包装器中的根元素对应的类的实例。

根元素不使用匿名复杂类型。 (在查看此模式时,您必须要小心,因为有一些complexType名称乍一看看起来相同,但一个是复数,另一个是单数 - 例如optionalParametersTypeoptionalParameterType

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="urn:com-mbm-parameters"
           targetNamespace="urn:com-mbm-parameters"
           elementFormDefault="qualified"
           jaxb:version="2.0">
  <xs:element name="parameters" type="parametersType" />

  <xs:complexType name="parametersType">
    <xs:sequence>
      <xs:element name="option-parameters"              type="optionParametersType"             minOccurs="0" maxOccurs="1"/>
      <xs:element name="positional-parameters"          type="positionalParametersType"         minOccurs="0" maxOccurs="1"/>
      <xs:element name="mutually-exclusive-parameters"  type="mutuallyExclusiveParametersType"  minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="properties-file" type="xs:string" use="optional"/> 
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="optionParametersType">
   <xs:sequence>
      <xs:element name="option-parameter" type="optionParameterType" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="optionParameterType">
     <xs:sequence>
       <xs:element name="description" type="descriptionType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="type" type="xs:string" use="required"/>
    <xs:attribute name="id" type="xs:string" use="required"/>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="command-line-name" type="xs:string" use="optional"/>
    <xs:attribute name="default-value" type="xs:string" use="optional"/>
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="positionalParametersType">
    <xs:sequence>
      <xs:element name="positional-parameter" type="positionalParameterType" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="positionalParameterType">
    <xs:sequence>
      <xs:element name="description" type="descriptionType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="type" type="xs:string" use="required"/>
    <xs:attribute name="id" type="xs:string" use="required"/>
    <xs:attribute name="name" type="xs:string" use="required"/>
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="descriptionType">
     <xs:attribute name="forValue" type="xs:string" use="required"/>
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="mutuallyExclusiveParametersType">
    <xs:sequence>
      <xs:element name="mutually-exclusive-parameter-set" type="mutuallyExclusiveParameterSetType" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="mutuallyExclusiveParameterSetType">
    <xs:sequence>
      <xs:element name="mutually-exclusive-parameter" type="mutuallyExclusiveParameterType" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <!--

  -->
  <xs:complexType name="mutuallyExclusiveParameterType">
    <xs:attribute name="id" type="xs:string" use="required"/>
    <xs:attribute name="value" type="xs:string" use="required"/>
  </xs:complexType>
</xs:schema>

这里是ObjectFactory的片段,它返回ParametersType类的实例:

/**
     * Create an instance of {@link JAXBElement }{@code <}{@link ParametersType }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "urn:com-mbm-parameters", name = "parameters")
    public JAXBElement<ParametersType> createParameters(ParametersType value) {
        return new JAXBElement<ParametersType>(_Parameters_QNAME, ParametersType.class, null, value);
    }

这是的地方,JAXBElement在整个ObjectFactory,中使用,因此不能消除两个或多个可能元素的歧义。

知道为什么会这样,以及如何消除使用包装器的需要?

1 个答案:

答案 0 :(得分:0)

对于顶级元素,您获得JAXBElement,在这种情况下,这是您的parameters元素。

基本原理是分离类型和元素(您可以将其视为类型的实例)。实际上,消除两个或多个可能元素的歧义 - 您可能拥有另一个模式,该模式具有相同parametersType的不同元素。全局元素有时通过<xs:element ref="..."/>引用,它们可以有替换组等,因此通常总是有JAXBElement个全局元素并不是完全不合理的。我不是说这是最好的设计决定,我只是说它有一些基本原理。

要摆脱包装器,请尝试使用xjc:simple或自行添加@XmlRootElement注释:

但最好不要打它,拥抱它。