# XML-Datei ein Array einlesen



## janat (17. Nov 2008)

Hallo zusammen, 

Kann mir jemand sagen, wie ich eine xml-datei in ein Array einlese? Ich habe eine Schnittstelle, die ich benutzen kann. Sie kriegt aber xml-dile als byte[] übergeben.

Ich habe schon eine Vorstellung wie eine XML-Datei ausgelesen wird, aber wie kann man die Struktur von der XML-Datei in einem array beubehalten? 


Gruß 
janat


----------



## Sergeant_Pepper (18. Nov 2008)

Hallo janat,

in einem Array wird eine Menge gleichartiger Objekte abgelegt. Das bedeutet, dass die Objekte entweder alle zur gleichen Klasse gehören, bzw. dass ihre individuelle Klasse von einer gemeinsamen Basisklasse abgeleitet ist (oder eine Schnittstelle implementiert).

Die Elemente in einer XML-Struktur können sich ziemlich stark voneinander unterscheiden und sind meistens mehrfach ineinander *verschachtelt*. In einem Array werden Elemente *sequenziell hintereinander* abgelegt.

Also ist ein Array *für sich genommen* wohl nicht so geeignet für deine Anforderung. Vielleicht gibt es in deinen Daten Teilbereiche, in denen gleichartige Elemente mehrfach hintereinander vorkommen. Die könnte man in einem Array ablegen. Und dieses Array könnte eine Instanzvariable einer Klasse sein, welche das übergeordnete XML-Element repräsentiert.


----------



## Murray (18. Nov 2008)

Vermutlich geht es um dieses Thema. 
Liegt die XML-Datei denn bereits als Datei vor, oder baust Du die XML-Struktur in Deinem Code auf (entweder als String oder mit irgendeiner DOM-Bibliothek)?
Eine Datei könntest Du einlesen und in einen ByteArrayOutputStream wieder aussschreiben; danach kannst Du Dir von diesem ByteArrayOutputStream die kompletten Daten als Byte-Array abholen. Bei einem String kannst Du Dir mit getBytes( "utf-8") direkt ein Byte-Array besorgen.


----------



## Sergeant_Pepper (18. Nov 2008)

@murray:
aha ... aber ich habe mich hierauf bezogen:


			
				janat hat gesagt.:
			
		

> wie kann man die Struktur von der XML-Datei in einem array beubehalten?


----------



## Murray (18. Nov 2008)

@Sergeant_Pepper:
Das glaube ich Dir gern; im Zusammenhang mit den anderen Thread sieht es für mich aber so aus, als wollte der TE den Inhalt einer XML-Datei einfach nur in ein byte[]-Array wandeln, weil das durch die zu nutzende Interface-Methode so vorgegeben ist. Dass dabei die eigentliche Struktur der XML-Datei auf der Strecke bleibt, ist klar.


----------



## Sergeant_Pepper (18. Nov 2008)

@Murray


			
				Murray hat gesagt.:
			
		

> im Zusammenhang mit den anderen Thread sieht es für mich aber so aus, als wollte der TE den Inhalt einer XML-Datei einfach nur in ein byte[]-Array wandeln


Ja, das würde ich auch so verstehen...

Vielleicht kann janat zur Klärung beitragen? ???:L


----------



## janat (18. Nov 2008)

Vielen Dank für Eure Antwortwen! 
Missverständnisse kommen bestimmt davon, dass ich wenig Ahnung von XML habe und mich nicht klar ausgedrückt habe.

Ja, ich muss die xml-datei in ein byte-Array umwandeln, um nachher den an die Mehtode insert (string key, byte[] data) zu übergeben.

So wie ich verstehe, soll ich zuerst ein XML-Document in meinem Programm zusammenzubauen. Versuche gerade, rauskriegen, wie das geht.

Gruß
janat


----------



## janat (19. Nov 2008)

Hallo zusammen,

jetzt habe ich es hingekriegt, eine XML-Document zu erstellen. Benutze dabei org.w3c.dom. Jetzt stehe ich vor dem Problem, wie ich das Documetn in ein byte [] schreibe. 

Kann mir jemand da weiterhelfen.


----------



## Murray (19. Nov 2008)

In etwa so:

```
import java.io.ByteArrayOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.Document;

...


		Document doc = ...; //--- das auszugebende Dokument
                byte[] ba = null;
		try {
			//--- Transformer vorbereiten und diverse Optionen setzen
			Transformer trans = TransformerFactory.newInstance().newTransformer();
			trans.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no");
			trans.setOutputProperty( OutputKeys.INDENT, "yes");
			trans.setOutputProperty( OutputKeys.STANDALONE, "yes");
			trans.setOutputProperty( OutputKeys.ENCODING, "ISO-8859-1");
			trans.setOutputProperty( OutputKeys.METHOD, "xml");

			//--- Quelle fuer die Transformation vorbereiten
			DOMSource src = new DOMSource( doc);

			//--- ByteArrayOutputStream als Ziel fuer die Ausgabetransformation erzeugen
			ByteArrayOutputStream baos = new ByteArrayOutputStream();

			//--- DOM in den Ausgabedatenstrom transformieren
			trans.transform( src, new StreamResult( baos));

			//--- Byte-Repraesentation abholen
			ba = baos.getByte();

		} catch ( Exception e) {
			e.printStackTarce();
		};
```


----------



## janat (21. Nov 2008)

Vielen Dank, das funktioniert! 

Ich habe allerdings noch 2 Fragen.

1) Die APIs, die ich benutze, haben Methoden:
insert (String key, byte[] data) und 
byte [] query (String key, String queryStr). 
Die erste fügt ein XML-Dokument ein und die zweite soll dann nach dem Schlüssel, der 

angegebene Xpath beinhaltet, suchen.

insert habe ich schon hingekriegt. Es ist mir nur aufgefallen, dass ich org.w3c.dom zum 

erstellen von meinem xml-document benutze und die Implementierung der APIs dom4j. Kann 

das zu Problemen führen? Gibt es dann Unstimmigkeiten?

2) Die zweite Frage war über die Zeitabfragen aus dem XPath. Habe sie in ein neues Thread übertragen, da sie zu dem Thema hier gar nicht passte.

Gruß
janat


----------



## Murray (21. Nov 2008)

janat hat gesagt.:
			
		

> Es ist mir nur aufgefallen, dass ich org.w3c.dom zum
> 
> erstellen von meinem xml-document benutze und die Implementierung der APIs dom4j.


Eigentlich ist XML immer XML, egal von welchem Framework es erzeugt worden ist. Solange das XML "well-formed" ist (anders lässt es sich mit W3C-DOM auch nicht erzeugen), wird es von einem beliebigen XML-Parser auch einlesbar sein (ansonsten hätte dieser Parser einen Fehler).


----------

