6

这是我的 .xsd 文件

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Person" type="PersonType"/>
    <xs:complexType name="PersonType">

        <xs:sequence>
            <xs:element name="Name" type="xs:string"/>
            <xs:element name="Address" type="AddressType" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="AddressType">

        <xs:sequence>
            <xs:element name="Number" type="xs:unsignedInt"/>
            <xs:element name="Street" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

使用这个 XSD 文件我生成了这个类:

package demo5;

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 = "PersonType", propOrder = {
  "name",
  "address"
})
public class PersonType {

@XmlElement(name = "Name", required = true)
protected String name;
@XmlElement(name = "Address", required = true)
protected List<AddressType> address;

public String getName() {
    return name;
}

public void setName(String value) {
    this.name = value;
}
public List<AddressType> getAddress() {
    if (address == null) {
        address = new ArrayList<AddressType>();
    }
    return this.address;
}

}

但 XSD 文件不会在 java 文件中生成 @XMLRootElement。任何人都可以为此提供解决方案。我知道可以生成根元素,但这不起作用。

4

2 回答 2

6

对于与命名复杂类型相对应的全局元素,将生成类上的注释而不是类上的@XmlElementDecl注释。这是因为可能有多个全局元素对应于同一个命名的复杂类型。使用 无法满足此用例。ObjectFactory@XmlRootElement@XmlRootElement

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="Person")
    public JAXBElement<PersonType> createPerson(PersonType personType) {
        return new JAXBElement<PersonType>(new QName("Person"), PersonType.class, personType);
    }

}

创建JAXBContext

JAXBContext基于从 XML Schema 生成的模型创建一个模型时,它应该在生成的模型的包名上完成。这样就ObjectFactory可以处理类中的元数据。

JAXBContext jc = JAXBContext.newInstance("demo5");

或者生成的ObjectFactory类:

JAXBContext jc = JAXBContext.newInstance(demo5.ObjectFactory.class);

解组类

当您解组一个根元素对应于@XmlElementDecl注释的类时,您将获得一个JAXBElementback 的实例。

JAXBElement<PersonType> je = (JAXBElement<PersonType>) unmarshaller.unmarshal(xml);
PersonType pt = je.getValue();

如果你想防止JAXBElement被返回,你总是可以JAXBIntrospector在解组操作的结果上使用:

PersonType pt = (PersonType) JAXBIntrospector.getValue(unmarshaller.unmarshal(xml));

了解更多信息

于 2013-11-11T17:11:57.060 回答
2

只会为顶级元素的@XMLRootElement匿名类型生成,而不是顶级类型。

于 2013-11-11T17:01:14.213 回答