首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相当简单的XSD在ObjectFactory中生成JAXBElement包装根元素类

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

Stack Overflow用户
提问于 2016-11-08 05:23:25
回答 1查看 671关注 0票数 0

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

根元素不使用匿名复杂类型。(在查看此模式时,您必须谨慎一点,因为有一对complexType名称乍一看是相同的,但一个是复数的,另一个是单数的--例如optionalParametersTypeoptionalParameterType)

代码语言:javascript
复制
<?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代码片段:

代码语言:javascript
复制
/**
     * 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,中使用的唯一位置,因此不需要消除两个或多个可能的元素的歧义。

知道为什么会发生这种情况,以及如何消除使用包装器的需要吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 08:11:49

您可以为顶级元素获取JAXBElement,在本例中,该元素是您的parameters元素。

其基本原理是分离类型和元素(您可以看到它们是类型的实例)。因此,实际上,要消除两个或多个可能的元素的歧义,您可能有另一个模式,它具有相同parametersType的不同元素。全局元素有时是通过<xs:element ref="..."/>引用的,它们可以有替换组等,所以在一般情况下,对于全局元素总是有JAXBElements是不完全不合理的。我不是说这是最好的设计决策,我只是说这里面有一些理由。

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

但最好不要反抗,拥抱它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40479544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档