在xsd上使用xjc时,包装类丢失

时间:2014-12-18 14:46:07

标签: java jaxb xsd xjc

我有以下XSD:

<xsd:element name="products" >
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="product" type="foo:myProduct" maxOccurs="unbounded" />
      </xsd:sequence>
      </xsd:complexType>
</xsd:element>

现在当我发布XJC时,它不会生成Products.class文件,只会生成Product.class。但是我的XML当然是这样的:

<products>
   <product>...</product>
   <product>...</product>
</products>

所以最后,我没有一个带有XmlRootElement注释的类,这是奇怪的。当然,我不能让编组工作。

任何暗示我的XSD可能有什么问题,或者我需要告诉XJC创建该类?在我看来,需要生成一个包装类!?

谢谢

1 个答案:

答案 0 :(得分:1)

选项:

  • 检查ObjectFactory类似createProducts(...)
  • 的方法
  • 使用JAXBElement<Products>
  • 使用<jaxb:class name="ProductsElement"/>自定义您的元素 - 您将ProductsElement获得@XmlRootElement
  • 您还可以使用@XmlRootElement添加到现有的Products课程中。

<强>更新

这是我的一个项目中的一个小例子。在那里我有一个像

这样的结果
<element name="Capabilities" type="wps:WPSCapabilitiesType">
</element>

ObjectFactory我有:

@XmlElementDecl(namespace = "http://www.opengis.net/wps/1.0.0", name = "Capabilities")
public JAXBElement<WPSCapabilitiesType> createCapabilities(WPSCapabilitiesType value) {
   return new JAXBElement<WPSCapabilitiesType>(_Capabilities_QNAME, WPSCapabilitiesType.class, null, value);
}

所以你应该在你的createProducts(...)中得到类似ObjectFactory的方法 - 不是类型而是元素。这是关于选项1。

选项2 - 它并不神秘。您只需创建JAXBElement的实例,提供元素的限定名称,值的类型和值:

new JAXBElement<WPSCapabilitiesType>(_Capabilities_QNAME, WPSCapabilitiesType.class, null, value);

在您的情况下将是new JAXBElement<ProductsType>(new QName("products"), Products.class, null, products)

最后,你说你没有Products课,只有Product课。嗯。这意味着您不会获得为products元素中声明的匿名复杂类型生成的类。这不是不可能的,但我怀疑这是一个案例。如果您有ProductsTypeProductsElement等课程,请检查您的课程。