# XML einlesen, analysieren, bearbeiten & als Textdatei ausgeben



## SmartGuy (30. Okt 2009)

Ich muss aus einer .xml-File z.B. pro OBST die BEERE, APFEL, BIRNE, PFLAUME, TRAUBE auflisten lassen.
Des Weiteren müsste ich pro BEERE alle ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN … auflisten lassen.


Es sollte also wie folgt aussehen:

OBST, BEERE, APFEL, BIRNE, PFLAUME, TRAUBE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	(…)
OBST, BEERE, APFEL, BIRNE, PFLAUME, TRAUBE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	ERDBEERE mit GESCHMACK, GEWICHT, KOSTEN, GROESSE 
	(…)
(…)

Wenn eine Variable fehlt muss eine Leerzeile mit Komma zwischengesetzt werden. Dies sollte vllt abgefragt werden, z.B. würde das dann so aussehen: bla1, bla2, , bla3


In dem Programm sollte evtl eine Struktur von Hand vorgebbar sein, in der das Kommagetrennte TXT-File ausgegeben wird:
Root: OU
Packages: OBST
Packages_Info: BEERE, APFEL, BIRNE, PFLAUME, TRAUBE, (…)
PackageMembers: ERDBEERE
PackageMembers_Info: GESCHMACK, GEWICHT, KOSTEN, GROESSE, (…)


Soviel zur Aufgabe. Durch meinen besten Freund, der mit g anfängt und mit oogle aufhört  hab ich zwar nichts optimales, aber wenigstens schon mal ein kleines Bsp gefunden, der eine XML-File einliest. Gibt aber einen Block vier mal aus. Wie man erkennen wird, handelt es sich um JDOM, da die files nur ein paar MB groß sind. Schreiben in ne Textdatei hab ich schon mal gemacht (BufferedWriter etc.)


```
package sax;

import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class ReaderTest {

    public ReaderTest() {
    }

    public static void main (String args[]) throws Exception {

        /* XMLWriter for viewing SAX events. */
        XMLWriter echo = new XMLWriter();
      
        /* Build document from xml file. */
        SAXBuilder builder = new SAXBuilder();
      
        builder.setXMLFilter(echo);
    
        System.out.println(" -- SAXBuilder(test2.xml), echo by XMLWriter -- \n");
        System.out.println("4");
        Document doc = builder.build("C:/Documents and Settings/GUI4ABT/Desktop/eclipse/workspace/Projekt_XML/src/test2.xml");
        System.out.println("5");
        System.out.println(" -- DocumentReader(doc) output by XMLWriter --\n");
        XMLReader parser = new DocumentReader(doc);
        
        echo.setParent(parser);
        
        StringWriter writer = new StringWriter();
        
        parser = new XMLWriter(echo, writer);
        System.out.println("9");
        parser.parse((InputSource)null);
        System.out.println("10");
        /* Reconstitute document from regurgitated string. */
        builder = new SAXBuilder();
        
        builder.setXMLFilter(echo);
        
        String xml = writer.toString();
        System.out.println("13");
        System.out.println(" -- xml string--\n");
        doc = builder.build(new StringReader(xml));
System.out.println("14");
        System.out.println(" -- SAXBuilder(xml) output by XMLOutputter --\n");
        XMLOutputter outputter = new XMLOutputter();
        System.out.println("15");
        outputter.output(doc, System.out);
System.out.println("16");
        System.out.println("\n");
    }

}
```



- Kann ich den Code so benutzen und ignorieren, dass er alles 4 mal ausgibt oder gibts ne bessere Lösung für das Einlesen? 
- Ich denke, mit ArrayListen bin ich gut dabei. Aber wie unterscheide ich, was was ist?
- Wie muss ich weiter vorgehen?


Danke und Gruß
SmartGuy


----------



## SmartGuy (2. Nov 2009)

da ich meinen selbsterstellten Beitrag komischerweise nicht mehr editieren kann, antworte ich einfach 

Habs jetzt so, dass ich meine XML-File einlese und genau so wieder in der Console ausgebe (siehe unteren Code). Wie kann ich auf die einzelnen Tags zugreifen und vergleichen?


```
...
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build("C:/test.xml");
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
```


----------

