# XML-Datei in einzelne XML-Dateien zerlegen



## heidiweber (8. Sep 2008)

Hallo

ich habe eine XML-Datei mit vielen einzelnen Datensätzen, die folgendermasen aussieht:


```
<xml>
   <records>
      <record>
         <irdnedwelcheAndereTagsAttribute></irdnedwelcheAndereTagsAttribute>
      </record>
      <record>
         <irdnedwelcheAndereTagsAttribute></irdnedwelcheAndereTagsAttribute>
      </record>
      <record>
         <irdnedwelcheAndereTagsAttribute></irdnedwelcheAndereTagsAttribute>
      </record>
      <record>
         <irdnedwelcheAndereTagsAttribute></irdnedwelcheAndereTagsAttribute>
      </record>
      <record>
         <irdnedwelcheAndereTagsAttribute></irdnedwelcheAndereTagsAttribute>
      </record>
   </records>
</xml>
```


Ich muss diese Datei zerlegen und benötige den Inhalt von einem <record> zum zum </record>. Mit allen Tags, Attributen und natürlich dem Inhalt.

Wie kann man dies am einfachsten realisieren?

Ich stehe gerade voll auf den Schlauch...

Kann mir jemand vielleicht bitte einen Tipp geben.

Vielen Dank schon mal.
Grüße
Heidi


----------



## FArt (8. Sep 2008)

XPath


----------



## heidiweber (10. Sep 2008)

Ich habe das mit SAX realisiert.

So in der Art.


```
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;



public class SAXLesen extends DefaultHandler {

static final String  neueZeile =  System.getProperty("line.separator");

static private Writer  out = null;

private StringBuffer textBuffer = null;

private String startMerker =  "";

public static void main(String[] argv) {

//  SAX-EventHandler erstellen
 

DefaultHandler handler = new SAXLesen();

//  Inhalt mit dem Default-Parser parsen
 

SAXParser saxParser;

try {

saxParser =  SAXParserFactory.newInstance().newSAXParser();

saxParser.parse(new File("c://xml_file.xml"), handler);

} catch (ParserConfigurationException pe)  {

pe.printStackTrace();

} catch (SAXException se) {

se.printStackTrace();

} catch (IOException ie) {

ie.printStackTrace();

}

}

//  SAX DefaultHandler Methoden


public void startDocument() throws SAXException {

ausgabe("auf geht's!" + neueZeile);

}

public void endDocument() throws SAXException {

ausgabe("finito!" + neueZeile);

}

//  Starttag auslesen


public void startElement(String namespaceURI, String localName,

String qName, Attributes attrs) throws SAXException {

if (qName.equals("Adresse")) {

} else if (qName.equals("record")) {

System.out.println("Kopf schreiben");

System.out.println("<record>");

} else {

textPuffer();

String eName = ("".equals(localName)) ? qName :  localName;

ausgabe("<" + eName);

//  Erfassen der Attribute in den Starttags
 

if (attrs != null) {

for (int i = 0; i  < attrs.getLength(); i++) {

String aName = attrs.getLocalName(i);

if ("".equals(aName))

aName = attrs.getQName(i);

ausgabe(" " + aName + "=\"" +  attrs.getValue(i) + "\"");

}

}

ausgabe(">");

}

}

//  Schlusstags auslesen
 

public void endElement(String namespaceURI, String localName, String qName)

throws SAXException {

if (qName.equals("Adresse")) {

} else if (qName.equals("record")) {

textPuffer();

String eName = ("".equals(localName)) ? qName :  localName;

ausgabe("</" + eName + ">");

System.out.println("Wurde jetzt hier das neue Machen:  \n\n");

} else {

textPuffer();

String eName = ("".equals(localName)) ? qName :  localName;

ausgabe("</" + eName + ">");

}

}

//  Erzeugt einen String aus den Char-Arrays und liest


//  diesen in einen StringBuffer ein
 

public void characters(char[] buf, int offset,  int len) throws SAXException {

String s = new String(buf, offset,  len);

// s  = s.trim();

// if (s.equals("\n")) {

// s = s.replace("\n", "");

// }
 

if (textBuffer ==  null)

textBuffer = new StringBuffer(s);

else
 

textBuffer.append(s);

}

/** ************** Hilfsmethoden ******************* */
 

//  Wandelt den StringBuffer in einen String und
 

//  übergibt ihn zur Ausgabe
 

//  "xxx" verdeutlicht die Arbeitsweise
 

private void textPuffer() throws SAXException {

if (textBuffer ==  null)

return;

ausgabe("" + textBuffer.toString());

textBuffer = null;

}

//  Ausgabe des Strings
 

//  "+++" verdeutlicht die Arbeitsweise
 

private void ausgabe(String s) throws SAXException {

try {

if (out ==  null)

out = new OutputStreamWriter(System.out, "UTF8");

out.write(s + "");

out.flush();

} catch (IOException ex) {

throw new SAXException("Ein-/Ausgabefehler", ex);

}

}

}
```



Das ist die XML-Datei:



```
<?xml version="1.0" encoding="UTF-8"?> 
<Adresse> 
	<record>
    <Nachname>Meier</Nachname> 
    <Vorname>Willi</Vorname> 
    <Strasse> 
        <Name>Schlossallee</Name> 
        <Nr>34</Nr> 
    </Strasse> 
    <Ort name="Hamburg" plz="20001"/> 
    </record>
    	<record>
    <Nachname>ssdss</Nachname> 
    <Vorname>ddddd</Vorname> 
    <Strasse> 
        <Name>Schlossallee</Name> 
        <Nr>34</Nr> 
    </Strasse> 
    <Ort name="Hamburg" plz="20001"/> 
    </record>
    	<record>
    <Nachname>fffff</Nachname> 
    <Vorname>ggggg</Vorname> 
    <Strasse> 
        <Name>Schlossallee</Name> 
        <Nr>34</Nr> 
    </Strasse> 
    <Ort name="Hamburg" plz="20001"/> 
    </record>
</Adresse>
```



Vielen Dank nochmal für die Hilfe
Grüße
Heidi


----------

