# Mit Jaxb2Marshaller XML validieren



## grindelaner (6. Dez 2010)

Hallo Leute,

hat jemand eine Ahnung wie ich eine XML über den Jaxb2Marshaller von Spring validieren kann?


----------



## Noctarius (6. Dez 2010)

Validierung gegen ein Schema? Chapter8.Marshalling XML using O/X Mappers <- Punkt 8.5.2


----------



## grindelaner (9. Dez 2010)

Nach etlichen Recherchen bin ich nun endlich in der Lage ein xsd-Schema in eine XML datei einzubinden und diese über den Jaxb2Marshaller zu validieren.

Eines bleibt mir aber noch ein Rätsel:

Warum funktioniert nur dann die Validierung, wenn ich das Schema in der spring.xml definiere?
[XML]
    <bean id="jaxb2MarshallerWithSchema" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" lazy-init="true">
        <property name="classesToBeBound">
            <list>
                <value>...xmlImpl...</value>
            </list>
        </property>
        <property name="schemas">
            <list>
                <value>file:lab//schema1.xsd</value>
            </list>
        </property>
    </bean>
[/XML]

gibt es nicht noch eine Möglichkeit das Schema zur Laufzeit im Code festzulegen?
Also z.B. mit Jaxb2Marshaller.setSchema(new FileSystemResource("meineXsd.datei"));?

das funktioniert irgendwie nicht....


----------



## Noctarius (9. Dez 2010)

Wäre es nicht sinnlos das Schema zur Laufzeit zu definieren? Immerhin können Zugriffe doch sicher als Concurrent-Access auftreten, damit würde ein Request möglicherweise das Schema eines anderen Requests überschreiben. Abgesehen davon ist das JAXB doch eigentlich schon an ein Schema gebunden.


----------



## grindelaner (10. Dez 2010)

Okay das macht wirklich nicht viel Sinn das Schema zur Laufzeit zu bestimmen.

Zur Zeit habe ich noch ein anders Problem mit dem Jaxb2Marshaller. Wenn ich den unmashaller starte frisst sich der System-Speicher voll und braucht ca. 5 min, um eine nur 8.000 Zeilen großen Datei einzulesen...

Das Merkwürdige: Wenn ich das erste mal unmarshall aufrufe benötige ich nur 187ms.... Wenn ich dann die selbe xml-Datei zu einem späteren Zeitpunkt in der Anwendung einlese dauert das extrem lange... 

Könnte das was mit Spring zu tun haben?


----------



## grindelaner (10. Dez 2010)

Das mit dem langsamen System hat sich erledigt.... Ich hätte nicht gedacht, dass wenn der Debugger so viel mehr an Zeit benötigt wird...


----------



## Noctarius (10. Dez 2010)

JAXB erzeugt im Hintergrund den gesamten Objektbaum wie ihn das XML abbildet. Damit werden ein Haufen Objekte erzeugt. Dies kann bei großen XML Files tatsächlich viel Speicher benutzen.
Bei großen Files sollte man einen SAX- oder Pull-Parser nutzen. Es gibt auch Object-Mapper Frameworks für XML die dies im Hintergrund machen (EMF eventuell?), ich weiß allerdings gerade nicht bei welchem ich das schon gelesen habe.

Zur Not mal auf java-source (Open Source XML Parsers in Java) oder bei Google schauen.


----------



## grindelaner (10. Dez 2010)

Die Validierung funktioniert bei mir fürs erste nun 
Ich verwende über spring den Jaxb2Marshaller und übergebe bei der Definierung des Beans in der spring.xml direkt das Schema. Für das Reagieren auf Fehler bei der Validierung verwende ich den ValidationEventHandler.


Ich möchte das xsd noch ausbauen:

Weißt du, ob es möglich ist über ein XSD:schema mehrere XML-Dateien zu verbinden?

Ich habe eine xs:ID in den einem Dokument und eine xs:IDREF in einem anderen Dokument, die auf die xs:ID referenziert?


----------



## Noctarius (10. Dez 2010)

Du kannst per import/include andere Namespaces in ein Schema einbinden. <xsd:import>-Element


----------



## grindelaner (10. Dez 2010)

Ich glaube ich stehe gerade auf dem Schlauch...
Habe ich das richtig verstanden?
<xsd:import> ist dafür da, um das xsd-Schema zu erweitern...?

Ich müsste quasi die XML-Daten-Datei erweitern, damit die xs:idref aus der Datei A auf die xs:id aus der Datei B zugreifen kann.

Ist das mit <xsd:import> möglich? wie würde denn so eine Implementierung ungefair aussehen...?


----------



## Noctarius (10. Dez 2010)

Achso du willst nicht das Schema erweitern, sondern mehrere XML Dateien "mergen" ... puh das geht auch irgendwie mit einem speziellen JAXB Command.

Vielleicht hilft dir auch das:
Multiple XML mappings for the same Java object using JAXB? - Stack Overflow
jaxb merge xml files - Google-Suche


----------



## grindelaner (10. Dez 2010)

Ich will es noch ein wenig komplizierter machen... 

Ich will die komplette Definition in xsd definieren. Mein Ziel ist es eine plattformunabhängige Schnittstellenbeschreibung in XSD zu schreiben.
Und dazu gehören leider auch Abhängigkeiten zwischen unterschiedlichen XML-Dateien


----------



## Noctarius (10. Dez 2010)

Das wirst du mit dem bestehenden System nicht schaffen, du kannst aber einen Satz Attribute in einem eigenen Namespace dafür definieren und diese selber analysieren.


----------



## grindelaner (11. Dez 2010)

meinst du ich soll den Namensraum im xsd durch enums erweitern?


----------



## Noctarius (11. Dez 2010)

Nein, du kannst auch an Attributen spezielle Namespaces angeben:

[xml]<foo:element attr1="im namespace von foo" bar:attr2="im namespace von bar" />[/xml]


----------

