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

JAXBContextXML スキーマから生成されたモデルに基づいて を作成する場合は、生成されたモデルのパッケージ名に対して行う必要があります。これは、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 に答える