# StAX und Reihenfolge in XML



## theuserbl (29. Dez 2011)

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

```
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


----------



## Final_Striker (29. Dez 2011)

Nimm einen anderen Parser z.b JDOM.


----------



## age (29. Dez 2011)

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.


```
element.getAttributeValue("name")
```


----------



## Noctarius (29. Dez 2011)

Vermutlich will er aber keinen DOM Parser nutzen  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 (29. Dez 2011)

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 (29. Dez 2011)

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 (30. Dez 2011)

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.


----------

