1

我有一个 xsd,其中每个元素名称及其复杂类型名称都是相同的。当我使用 JAXB 从 xsd 生成 Java 时,这会产生问题。此 xsd 已由外部服务提供商提供。XSD 是错误的还是我在生成 xsd 时做错了什么。以下是 xsd 的示例:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="unqualified">
<xs:element name="Discounts" type="Discounts"/>
    <xs:complexType name="Discounts">
    <xs:complexContent>
        <xs:extension base="listWithSizeAttribute">
            <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" name="Discounttest" type="Discounttest"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

每当我使用 JAXB 生成 Java 对象时,都会收到显示重复元素折扣的错误。整个xsd充满了这样的元素。因此,我认为我这边有问题。

谢谢, 阿克谢

4

1 回答 1

0

XML 模式

当全局元素和复杂类型具有相同名称时没有问题。我已经清除了您的 XML 模式以使其有效,以便我可以在其上运行模式编译。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    attributeFormDefault="unqualified" elementFormDefault="unqualified">
    <xs:element name="Discounts" type="Discounts" />
    <xs:complexType name="listWithSizeAttribute" />
    <xs:complexType name="Discounttest" />
    <xs:complexType name="Discounts">
        <xs:complexContent>
            <xs:extension base="listWithSizeAttribute">
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" minOccurs="0"
                        name="Discounttest" type="Discounttest" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

折扣

JAXB (JSR-222) 实现为复杂类型生成 Java 类,因此将为复杂类型生成一个类Discounts

package forum11981855;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Discounts", propOrder = {
    "discounttest"
})
public class Discounts
    extends ListWithSizeAttribute
{

    @XmlElement(name = "Discounttest")
    protected List<Discounttest> discounttest;

    public List<Discounttest> getDiscounttest() {
        if (discounttest == null) {
            discounttest = new ArrayList<Discounttest>();
        }
        return this.discounttest;
    }

}

对象工厂

将在与全局元素对应@XmlElementDecl的类上生成注释。ObjectFactoryDiscounts

package forum11981855;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    private final static QName _Discounts_QNAME = new QName("", "Discounts");

    public ObjectFactory() {
    }

    public Discounttest createDiscounttest() {
        return new Discounttest();
    }

    public Discounts createDiscounts() {
        return new Discounts();
    }

    public ListWithSizeAttribute createListWithSizeAttribute() {
        return new ListWithSizeAttribute();
    }

    @XmlElementDecl(namespace = "", name = "Discounts")
    public JAXBElement<Discounts> createDiscounts(Discounts value) {
        return new JAXBElement<Discounts>(_Discounts_QNAME, Discounts.class, null, value);
    }

}

了解更多信息

于 2012-08-16T19:24:04.653 回答