我有以下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创建该类?在我看来,需要生成一个包装类!?
谢谢
答案 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
元素中声明的匿名复杂类型生成的类。这不是不可能的,但我怀疑这是一个案例。如果您有ProductsType
或ProductsElement
等课程,请检查您的课程。