Mit Jaxb2Marshaller XML validieren

grindelaner

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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?
 
Zuletzt bearbeitet:

grindelaner

Bekanntes Mitglied
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...?
 

grindelaner

Bekanntes Mitglied
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

Top Contributor
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.
 

Noctarius

Top Contributor
Nein, du kannst auch an Attributen spezielle Namespaces angeben:

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

Ähnliche Java Themen


Oben