StAX und Reihenfolge in XML

theuserbl

Bekanntes Mitglied
Hi!

Ich habe von einem anderen Programm XML-Dateien die ungefähr so ausssehen:

[XML]<?xml version="1.0" encoding="UTF-8"?>
<SourceFile>
<Param Name="(Name)" Value="Form4"/>
<Param Name="BackColor" Value="-2147483633"/>
<Param Name="ForeColor" Value="-2147483630"/>
<Param Name="Width" Value="400"/>
<Param Name="Height" Value="300"/>
<Param Name="Visible" Value="True"/>
<Object Type="VB/Frame">
<Param Name="BorderColor" Value="-2147483642"/>
<Param Name="BackColor" Value="-2147483633"/>
<Param Name="ForeColor" Value="-2147483630"/>
<Param Name="Width" Value="217"/>
<Param Name="Height" Value="201"/>
<Param Name="Left" Value="50"/>
<Param Name="Top" Value="50"/>
<Param Name="Visible" Value="True"/>
<Param Name="(Name)" Value="Frame9"/>
<Object Type="VB/Frame">
<Param Name="BorderColor" Value="-2147483642"/>
<Param Name="BackColor" Value="-2147483633"/>
<Param Name="ForeColor" Value="-2147483630"/>
<Param Name="Width" Value="185"/>
<Param Name="Height" Value="169"/>
<Param Name="Left" Value="16"/>
<Param Name="Top" Value="16"/>
<Param Name="Visible" Value="True"/>
<Param Name="(Name)" Value="Frame8"/>
<Object Type="VB/Shape">
<Param Name="BackColor" Value="-2147483643"/>
<Param Name="BorderColor" Value="0"/>
<Param Name="FillColor" Value="0"/>
<Param Name="Width" Value="25"/>
<Param Name="Height" Value="25"/>
<Param Name="Left" Value="40"/>
<Param Name="Top" Value="24"/>
<Param Name="Visible" Value="True"/>
<Param Name="(Name)" Value="Shape8"/>
</Object>
<Object Type="VB/Shape">
<Param Name="BackColor" Value="-2147483643"/>
<Param Name="BorderColor" Value="0"/>
<Param Name="FillColor" Value="0"/>
<Param Name="Width" Value="25"/>
<Param Name="Height" Value="25"/>
<Param Name="Left" Value="112"/>
<Param Name="Top" Value="24"/>
<Param Name="Visible" Value="True"/>
<Param Name="(Name)" Value="Shape9"/>
</Object>
</Object>
</Object>
</SourceFile>[/XML]

Zum Einlesen verwende ich javax.xml.stream.* und javax.xml.stream.event.*. Also StAX.

Mein Problem ist, daß ich von jedem "Object" den Wert von "(Name)" ganz am Anfang brauche.
Außerdem sollten die höherliegeden eher abgeabrietet werden, als die dadrunterliegenden (z.B. "Frame9" vor "Shape8").

Bis jetzt sehe ich nur die unschöne Lösung die Schleife ("while (parser.hasNext())" ) zu durchlaufen und alle Events von event = parser.nextEvent(); in einem Event-Array zwischenzuspeichern und neu zu durchlaufen.

"parser" ist bei mir definiert als
Java:
public static XMLEventReader parser;

Die inneren "Object"-Tags rufe ich rekursiv auf. Dummerweise werden sie somit vor den äußeren Object-Tags abgearbeitet. Es sollte aber anders herum sein. Auch hier sehe ich nur als Lösung die Events in einem Array zwischenzuspeichern.

Oder hat noch jemand eine andere, bessere Lösung?

Grüße
theuserbl
 

age

Mitglied
Ich kann da JDOM auch empfehlen.
Hab den Parser erst neulich benutzt.
Ich habe zwar gelesen, dass es vieles geben soll, das komfortabler sein soll...
war aber mit JDOM zufrieden.

Falls du jeweils nur eine Eigenschaft benötigst, bietet dir JDOM da auch eine nette Möglichkeit, soweit ich mich recht erinnere.

Java:
element.getAttributeValue("name")
 

Noctarius

Top Contributor
Vermutlich will er aber keinen DOM Parser nutzen :p Auf gewissen Plattformen (z.B. Smartphones mit Android) kann es durchaus sinnvoll sein keinen DOM zu nutzen, wegen der hohen Speicheranforderung.

Als Alternative zu StaX könntest du noch einen SAX nutzen, auch hier wird die Datei nicht komplett vorge-"parsed".
 

theuserbl

Bekanntes Mitglied
Danke erst einmal für Eure Hilfe. Bin aber noch immer unschlüssig, was nun am beste ist.

Es ist schon für Java SE und nicht für Android oder so. Aber ich bevorzuge es, kleine überschaubare Bibliotheken zu haben.
Am besten ist, wenn der XML-Parser schon im JRE enthalten ist. Noch besser, wenn er schon in früheren Java-Versionen drin war.

Wenn ich einen externen XML-Parser nehme, wäre mir wiederum ein möglichst kleiner lieber.
JDOM baut hingegen auf Xalan, Xerces, XML-APIs und Jaxen auf.
Und die Alternative XOM baut auf Xalan, Xerces und XML-APIs auf.
Das sind ja ganz schöne Schwergewichte.

Grüße
theuserbl
 

age

Mitglied
Ja das ist wohl richtig, Lightweight ist JDOM sicherlich nicht.
Allerdings... warum legst du so viel wert darauf?
Auf heutigen Maschinen spielt eine Bibliothek mehr oder weniger nicht mehr eine so entscheidende Rolle?
 

mvitz

Top Contributor
Also JavaSE bietet im Package javax.xml.parsers direkt eine SAX und eine DOM API an. Die DOM API dort ist ein wenig umständlicher als JDOM, dafür aber direkt im JDK dabei.

DocumentBuilder heißt hier das Stichwort.
 

Ähnliche Java Themen

Neue Themen


Oben