1つのXSDに2つ目の要素を含む要素が含まれているXSDが2つあります。基本的に、XSD 1には、XSD 2の任意の要素を含むことができる要素「etta」があります。Jaxbとアンマーシャリングが含まれています。XSD
xjcを使用してクラスを生成し、逆シリアル化すると、Meta要素にXSD 2の要素がJAXBElements実際のクラスはXSD 2から生成されました。私は両方のクラスのセットを私のプログラムに入れました。パッケージ情報は正しいです。
これは私がXSDを定義した方法です。私は問題が自分の「任意の」要素だと思っています。
<xs:schema xmlns="NS1" elementFormDefault="qualified"
xmlns:ns1="NS2"
targetNamespace="NS1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="NS2" schemaLocation="./NS2.xsd" />
<xs:complexType name="Meta">
<xs:sequence>
<xs:any namespace="NS2" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
...
</xs:schema>
だから基本的に私が何をしたいし、それをアンマーシャリングする、JAXBをしたいと思います「ここでXSD2で定義されている1つの以上の要素を行く」を意味する要素です。
jaxbがXSD2の要素を使用してメタコンテンツをデシリアライズするために、XSDをどのように変更する必要がありますか?
--edit-
これは、メタクラスに対して生成XJCです:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Meta", propOrder = {
"any"
})
public class Meta
extends BaseObject
{
@XmlAnyElement(lax = true)
protected List<Object> any;
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
}
}
- (質問を一致させるためにNSを変更)、元XSD2を編集 -
<xs:schema xmlns="NS2" elementFormDefault="qualified" targetNamespace="syncml:NS2" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="MetInf">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="FieldLevel" />
<xs:element minOccurs="0" maxOccurs="1" ref="Format" />
<xs:element minOccurs="0" maxOccurs="1" ref="Type" />
<xs:element minOccurs="0" maxOccurs="1" ref="Mark" />
<xs:element minOccurs="0" maxOccurs="1" ref="Size" />
<xs:element minOccurs="0" maxOccurs="1" ref="Anchor" />
<xs:element minOccurs="0" maxOccurs="1" ref="Version" />
<xs:element minOccurs="0" maxOccurs="1" ref="NextNonce" />
<xs:element minOccurs="0" maxOccurs="1" ref="MaxMsgSize" />
<xs:element minOccurs="0" maxOccurs="1" ref="MaxObjSize" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="EMI" />
<xs:element minOccurs="0" maxOccurs="1" ref="Mem" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="FieldLevel">
<xs:complexType />
</xs:element>
<xs:element name="Format" type="xs:string" />
<xs:element name="Type" type="xs:string" />
<xs:element name="Mark" type="xs:string" />
<xs:element name="Size" type="xs:string" />
<xs:element name="Anchor">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="Last" />
<xs:element ref="Next" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Last" type="xs:string" />
<xs:element name="Next" type="xs:string" />
<xs:element name="Version" type="xs:string" />
<xs:element name="NextNonce" type="xs:string" />
<xs:element name="MaxMsgSize" type="xs:string" />
<xs:element name="MaxObjSize" type="xs:string" />
<xs:element name="EMI" type="xs:string" />
<xs:element name="Mem">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="SharedMem" />
<xs:element ref="FreeMem" />
<xs:element ref="FreeID" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="FreeID" type="xs:string" />
<xs:element name="FreeMem" type="xs:string" />
<xs:element name="SharedMem">
<xs:complexType />
</xs:element>
</xs:schema>
- これは私のXSD1でメタが使われている方法です:
<xs:element name="TargetRef" type="xs:string" />
<xs:element name="VerDTD" type="xs:string" />
<xs:element name="VerProto" type="xs:string" />
<xs:element name="Item">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="Target" />
<xs:element minOccurs="0" maxOccurs="1" ref="Source" />
<xs:element minOccurs="0" maxOccurs="1" ref="SourceParent" />
<xs:element minOccurs="0" maxOccurs="1" ref="TargetParent" />
<xs:element minOccurs="0" maxOccurs="1" ref="Meta" />
<xs:element minOccurs="0" maxOccurs="1" ref="Data" />
<xs:element minOccurs="0" maxOccurs="1" ref="MoreData" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Meta" type="xs:string" />
<xs:element name="Correlator" type="xs:string" />
<xs:element name="Data" type="xs:string" />
これらの 'JAXBElement'にはXSD 2のクラスのインスタンスが含まれていますか?彼らはすべき。あなたの問題が 'JAXBElement'ラッパーだけを避けているのであれば、XSD 2クラスに' @ XmlRootElement'があることを確認してください。 – lexicore
これらは実際にはXSD2のクラスのインスタンスを含んでおらず、name = "NS2:(some elements)"およびdeclaredType = StringのプレーンJAXBElementsを含んでいます。私のクラスは@XmlRootElementを持っています(XSD1とXSD2の両方のクラスはxjcを使って生成されます)。元の質問に追加します。 –