Hallo zusammen
Ich komme bei meinem Vorhaben einfach nicht mehr weiter... :noe:
Einlesen will ich ein einfaches XML-Dokument das so aussieht:
[XML]
<root>
<detailierteInformationen>
<zahl>12345</zahl>
<att1>"hier kommt ein Wert"</att1>
<att2>"noch ein Wert"</att2>
</detailierteInformationen>
</root>
[/XML]
JAXB soll beim Marshal folgendes ausgeben:
[XML]
<de-schema:detailierteInformationen att1="hier kommt ein Wert"" att2="noch ein Wert">12345</de-schema:detailierteInformationen>
[/XML]
Dafür habe ich zwei Schemata. Die Schemata werden mit JAXB eingelesen und soll dann mit XmlAdapter behandelt werden.
Hauptschema (Namespace: de-schema):
[XML]
<xs:element name="detailierteInformationen"
id="de-schema-detailierteInformationen"
substitutionGroup="xi:item"
type="xi:zahlItemType" />
[/XML]
2. Schema (Namespace: xi):
[XML]
<element name="root">
<complexType>
<sequence>
<element ref="...." minOccurs="1" maxOccurs="unbounded" />
<element ref="...." minOccurs="1" maxOccurs="unbounded" />
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="xi:item"/>
</choice>
</sequence>
<attribute .... />
</complexType>
</element>
<element name="item" type="anyType" abstract="true">
<complexType name="zahlItemType" final="extension">
<simpleContent>
<extension base="xi:zahl">
<attributeGroup ref="xi:weitereAttribute" />
</extension>
</simpleContent>
</complexType>
<simpleType name="zahl">
<restriction base="decimal" />
</simpleType>
<attributeGroup name="weitereAttribute">
<attributeGroup ref="xi:nochmalsWeitereAttribute" />
<attribute name="att1" type="xi:att1Type" use="optional" />
<attribute name="att2" type="xi:att2Type" use="optional" />
</attributeGroup>
[/XML]
Mit JAXB generierter Java-Code.
Objectfactory vom Hauptschema:
XI-Schema hat den Java-Code:
Beim Einlesen der XML habe ich die Werte als Elemente und sollen dann als Attribute erscheinen.
Dafür hätte ich die Klasse ZahlenItemTypeAdapter.
Jedoch funktioniert das nicht so wie ich es will! :noe: Er erkennt die XmlAdapter Klasse nicht.
Es soll später auch möglich sein, z.B. das Element detailierteInformationen zu erkennen und die Werte von dem auf die Werte eines anderen Elements addieren. Desweiteren muss beim Einlesen der XML kein Namespace vorhanden sein. Beim Ausgeben jedoch schon.
Ich komme bei meinem Vorhaben einfach nicht mehr weiter... :noe:
Einlesen will ich ein einfaches XML-Dokument das so aussieht:
[XML]
<root>
<detailierteInformationen>
<zahl>12345</zahl>
<att1>"hier kommt ein Wert"</att1>
<att2>"noch ein Wert"</att2>
</detailierteInformationen>
</root>
[/XML]
JAXB soll beim Marshal folgendes ausgeben:
[XML]
<de-schema:detailierteInformationen att1="hier kommt ein Wert"" att2="noch ein Wert">12345</de-schema:detailierteInformationen>
[/XML]
Dafür habe ich zwei Schemata. Die Schemata werden mit JAXB eingelesen und soll dann mit XmlAdapter behandelt werden.
Hauptschema (Namespace: de-schema):
[XML]
<xs:element name="detailierteInformationen"
id="de-schema-detailierteInformationen"
substitutionGroup="xi:item"
type="xi:zahlItemType" />
[/XML]
2. Schema (Namespace: xi):
[XML]
<element name="root">
<complexType>
<sequence>
<element ref="...." minOccurs="1" maxOccurs="unbounded" />
<element ref="...." minOccurs="1" maxOccurs="unbounded" />
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="xi:item"/>
</choice>
</sequence>
<attribute .... />
</complexType>
</element>
<element name="item" type="anyType" abstract="true">
<complexType name="zahlItemType" final="extension">
<simpleContent>
<extension base="xi:zahl">
<attributeGroup ref="xi:weitereAttribute" />
</extension>
</simpleContent>
</complexType>
<simpleType name="zahl">
<restriction base="decimal" />
</simpleType>
<attributeGroup name="weitereAttribute">
<attributeGroup ref="xi:nochmalsWeitereAttribute" />
<attribute name="att1" type="xi:att1Type" use="optional" />
<attribute name="att2" type="xi:att2Type" use="optional" />
</attributeGroup>
[/XML]
Mit JAXB generierter Java-Code.
Objectfactory vom Hauptschema:
Java:
@XmlElementDecl(namespace = "de-schema", name = "detailierteInformationen", substitutionHeadNamespace = "xi", substitutionHeadName = "item")
public JAXBElement<zahlItemType> createDetaillierteInformation(zahlItemType zahl) {
return new JAXBElement<zahlItemType>(_detailierteInformationen_QNAME, zahlItemType.class, null, zahl);
}
XI-Schema hat den Java-Code:
Java:
Root.class
@XmlElementRef(name = "item", namespace = "xi", type = JAXBElement.class, required = false)
//...
protected List<Object> itemList;
ZahlItemType.class
@XmlJavaTypeAdapter(ZahlItemTypeAdapter.class)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "zahlItemType", namespace = "xi", propOrder = {
"zahl"
})
public class ZahlItemType {
// Hier stehen die Getter und Setter Methoden, sowie Annotationen @XmlValue und @XmlAttribute.
}
Beim Einlesen der XML habe ich die Werte als Elemente und sollen dann als Attribute erscheinen.
Dafür hätte ich die Klasse ZahlenItemTypeAdapter.
Java:
public class ZahlItemTypeAdapter extends XmlAdapter<AdaptedZahl, ZahlItemType> {
// Methoden marshal und unmarshal...
}
Jedoch funktioniert das nicht so wie ich es will! :noe: Er erkennt die XmlAdapter Klasse nicht.
Es soll später auch möglich sein, z.B. das Element detailierteInformationen zu erkennen und die Werte von dem auf die Werte eines anderen Elements addieren. Desweiteren muss beim Einlesen der XML kein Namespace vorhanden sein. Beim Ausgeben jedoch schon.
Zuletzt bearbeitet: