XML Import/Export mit Support von unbekannten Attributen/Elementen

zcoder

Mitglied
Hallo liebes Forum!

Ich versuche mittels Java 17 und JAXB ein XML File zu importieren, und habe dazu mittels XSD-File entsprechende Klassen für das Marshalling/Unmarshalling generiert.
Soweit so gut.

Das Problem:
Es soll auch möglich sein XML Files mit einer älteren oder neueren Spezifikation zu im- bzw. exportieren.
Im Falle eines älteren Files würden entsprechend fehlende Attribute einfach null gesetzt. Kein Problem.
Wie aber kann ich, wenn ich ein File importieren, ein paar Dinge ändere, und wieder exportiere, sicherstellen, dass mir unbekannte Attribute oder Elemente des Originalfiles erhalten bleiben?

Ist JAXB dafür überhaupt der beste Weg oder gibt es bereits bessere Lösungen?
 

KonradN

Super-Moderator
Mitarbeiter
Nur um dir einen Wink zu geben, was Du evtl. suchst:
@XmlAnyAttribute und @XmlAnyElement

Damit kannst Du unbekannte Attribute und Elemente in eine Map serialisieren.

Aber die genauen Details und so kann ich Dir jetzt nicht sagen und das müsstest Du dann erst einmal selbst etwas recherchieren.

PS: Sorry, er hatte versehentlich beim Schreiben bereits die Antwort gepostet.
 

zcoder

Mitglied
Bonusfrage :)

Ich habe nun mein XSD um zahlreiche <xs:anyAttribute/> bzw. <xs:any/> erweitert. Funktioniert super.
Nachdem die Struktur aber ziemlich komplex ist - gibt es eine Möglichkeit das Schema mit einem einfachen Attribut im Header als "relaxed" zu definieren, sodass ich nicht händisch überall diese Tags einfügen muss?
Ziel soll sein, dass an jeder Stelle beliebig viele Attribute bzw. (Sub-)Elemente in einem XML-File sein können.
 

KonradN

Super-Moderator
Mitarbeiter
Hmm, ich fürchte ganz so einfach geht das nicht. Aber Du könntest einen Grundtypen definieren und diesen dann verwenden, also etwas wie:

Grundtyp
XML:
    <xs:complexType name="anyElementType">
        <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
        </xs:sequence>
        <xs:anyAttribute processContents="lax"/>
    </xs:complexType>

Eigene Typen dann so in der Art:
XML:
    <xs:complexType name="specificElementType">
        <xs:complexContent>
            <xs:extension base="anyElementType">
                <xs:sequence>
                    <xs:element name="knownElement" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

Aber im Augenblick sehe ich hier keinen wirklichen Sinn in dem Vorgehen. Was genau willst Du erreichen?

Du sprichst ja von:
Es soll auch möglich sein XML Files mit einer älteren oder neueren Spezifikation zu im- bzw. exportieren.
Somit hast Du mehrere Versionen der Spezifikation. Damit hast Du die genau passende XSD zu dem XML. Im Schema macht es also so keinen Sinn, hier alles zu erlauben. Sondern das XML nutzt dann entsprechende Namespaces a.la.
XML:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.com/schema/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.example.com/schema/1.0.0 schema-v1.0.0.xsd">
    
    <!-- Irgend ein Inhalt natürlich -->
    
</root>

Somit hast Du von Seiten des Schemas kein Problem. Du kannst beliebige Versionen haben, die jeweilige Version wird angegeben. Dann hat man beim erstellen die volle Kontrolle und auch die Prüfung, dass es ok ist. Daher auch die Hinweise zu den jaxb Annotations - denn Du hast genau eine Implementation und willst dann alle möglichen Schemata lesen können. Da hast Du diese Schema-Wahl halt nicht mehr (Wobei man sich da überlegen könnte, aus den vorhandenen Schemata einfach ein universal-Schema zu bauen. Halt ein Merge von Schema-Versionen. Keine Ahnung, ob es da etwas fertiges gibt, aber da kann man zur Not schauen: XSDs sind auch nur XML und es gibt paar Namespaces, die definiert sind, die man können muss ... da kann man sich zur Not etwas bauen ...) Aber braucht man es oder ist es sinnvoll? Ich sehe da derzeit nicht die Notwendigkeit aber deine Anforderungen kenne ich halt auch nicht.
 

Ähnliche Java Themen


Oben