JAVA SAX Parser Beispiel/Tutorial

Posted: Juli 16th, 2010 | Filed under: Internet, Programmieren, Tutorials | Tags: , , , , , | 19 Comments »

„Simple Api for XML“ (SAX) ist eine API zum Parsen(analysieren) von XML-Dateien. Ursprünglich wurde SAX in Java geschrieben ist mittlerweile aber auch in anderen Sprachen verfügbar.

Ich möchte hier ein kleines Beispiel geben um euch zu zeigen wie ihr, in der Praxis, den SAX-Parser benutzen könnt.

Angenommen ihr bekommt eine XML-Datei vorgelegt und sollt alle Personen in einer ArrayList abspeichern. In der XML-Datei befindet sich folgender Inhalt.

XML-Beispiel-Datei

personen.xml

Person.java

Das Personen Objekt repräsentiert eine Person in der XML-Beispiel Datei und dient lediglich als Datenhaltung für die Informationen.

package parser;

import java.util.Date;

public class Person {

  private int id;
  private String name;
  private String vorname;
  private Date geburtsdatum;
  private String postleitzahl;
  private String ort;

  public Person() {

  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getVorname() {
    return vorname;
  }

  public void setVorname(String vorname) {
    this.vorname = vorname;
  }

  public Date getGeburtsdatum() {
    return geburtsdatum;
  }

  public void setGeburtsdatum(Date geburtsdatum) {
    this.geburtsdatum = geburtsdatum;
  }

  public String getPostleitzahl() {
    return postleitzahl;
  }

  public void setPostleitzahl(String postleitzahl) {
    this.postleitzahl = postleitzahl;
  }

  public String getOrt() {
    return ort;
  }

  public void setOrt(String ort) {
    this.ort = ort;
  }

  @Override
  public String toString() {
    return "[[" this.id + "] ["this.name + "] [" this.vorname + "]" " [" this.ort
        "] [" this.postleitzahl + "] [" this.geburtsdatum + " ]]";
  }
}

Main.java

Im Folgenden sieht man sehr gut wie man einen XMLReader initialisieren muss. Es besteht sogar die Möglichkeit dem SAX Parser eine DTD zu übergeben. Dies wurde aber in meinem Beispiel einfachheitshalber auskommentiert. Die eigentliche implementierung der SAX Parser Logik steckt jedoch im ContentHandler, dieser folgt anschließend.


package parser;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class Main {
  public static void main(String[] args) {
    try {
      // XMLReader erzeugen
      XMLReader xmlReader = XMLReaderFactory.createXMLReader();
      
      // Pfad zur XML Datei
      FileReader reader = new FileReader("X:\\personen.xml");
      InputSource inputSource = new InputSource(reader);

      // DTD kann optional übergeben werden
      // inputSource.setSystemId("X:\\personen.dtd");

      // PersonenContentHandler wird übergeben
      xmlReader.setContentHandler(new PersonenContentHandler());

      // Parsen wird gestartet
      xmlReader.parse(inputSource);
    catch (FileNotFoundException e) {
      e.printStackTrace();
    catch (IOException e) {
      e.printStackTrace();
    catch (SAXException e) {
      e.printStackTrace();
    }
  }
}

PersonenContentHandler.java

Beim Parsen der XML-Datei werden die jeweiligen ContentHandler Funktionen aufgerufen.


package parser;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;

public class PersonenContentHandler implements ContentHandler {

  private ArrayList<Person> allePersonen = new ArrayList<Person>();
  private String currentValue;
  private Person person;

  // Aktuelle Zeichen die gelesen werden, werden in eine Zwischenvariable
  // gespeichert
  public void characters(char[] ch, int start, int length)
      throws SAXException {
    currentValue = new String(ch, start, length);
  }

  // Methode wird aufgerufen wenn der Parser zu einem Start-Tag kommt
  public void startElement(String uri, String localName, String qName,
      Attributes attsthrows SAXException {
    if (localName.equals("person")) {
      // Neue Person erzeugen
      person = new Person();

      // Attribut id wird in einen Integer umgewandelt und dann zu der
      // jeweiligen Person gesetzt
      person.setId(Integer.parseInt(atts.getValue("id")));
    }
  }

  // Methode wird aufgerufen wenn der Parser zu einem End-Tag kommt
  public void endElement(String uri, String localName, String qName)
      throws SAXException {

    // Name setzen
    if (localName.equals("name")) {
      person.setName(currentValue);
    }

    // Vorname setzen
    if (localName.equals("vorname")) {
      person.setVorname(currentValue);
    }

    // Datum parsen und setzen
    if (localName.equals("geburtsdatum")) {
      SimpleDateFormat datumsformat = new SimpleDateFormat("dd.MM.yyyy");
      try {
        Date date = datumsformat.parse(currentValue);
        person.setGeburtsdatum(date);
      catch (ParseException e) {
        e.printStackTrace();
      }
    }

    // Postleitzahl setzen
    if (localName.equals("postleitzahl")) {
      person.setPostleitzahl(currentValue);
    }

    // Ort setzen
    if (localName.equals("ort")) {
      person.setOrt(currentValue);
    }

    // Person in Personenliste abspeichern falls Person End-Tag erreicht
    // wurde.
    if (localName.equals("person")) {
      allePersonen.add(person);
      System.out.println(person);
    }
  }

  public void endDocument() throws SAXException {}
  public void endPrefixMapping(String prefixthrows SAXException {}
  public void ignorableWhitespace(char[] ch, int start, int length)
      throws SAXException {}
  public void processingInstruction(String target, String data)
      throws SAXException {}
  public void setDocumentLocator(Locator locator) {  }
  public void skippedEntity(String namethrows SAXException {}
  public void startDocument() throws SAXException {}
  public void startPrefixMapping(String prefix, String uri)
    throws SAXException {}
}

Ausgabe

Nach dem durchlaufen des SAX Parsers befinden sich nun alle Personen in der ArrayList allePersonen.
[[1] [Mustermann] [Max] [Bierdorf] [54321] [Fri Nov 25 00:00:00 CET 1983 ]]
[[2] [Müller] [Petra] [Bierdorf] [76543] [Fri Apr 13 00:00:00 CEST 1990 ]]

Personen Liste


19 Comments on “JAVA SAX Parser Beispiel/Tutorial”

  1. 1 netjens said at 17:34 on Juli 11th, 2011:

    cooles kurz&knackiges beispiel, danke!

  2. 2 Michael said at 11:49 on Juli 27th, 2011:

    Super Tutorial

    Vielen Dank, dein Tutorial hat mir sehr viel Zeit erspart!

    Sauberer Code!

    Weiter so 😀

  3. 3 admin said at 20:42 on Juli 27th, 2011:

    Danke Leute 😀

  4. 4 Maurice said at 17:18 on August 16th, 2011:

    geiles Ding man… vielen dank

  5. 5 Simple XML Framework -> Objekte ansprechen in tieferer Ebene - Android-Hilfe.de said at 16:15 on August 24th, 2011:

    […] AW: Simple XML Framework -> Objekte ansprechen in tieferer Ebene Hi Rotesmofa, Stand gestern oder war es vorgestern auch vor diesem Problem halt einfach wegen eines RSS Feeds. Ich habe es nun nach dieser Anleitung gemacht, hoffe es hilft dir. JAVA SAX Parser Beispiel/Tutorial :: Ein Karlsruher Bloggt! […]

  6. 6 Koreatanne said at 20:45 on November 28th, 2012:

    solche Tutorials braucht die Welt.

    Danke.

  7. 7 animusanima said at 20:47 on Juli 17th, 2013:

    Danke für das Tutorial!

    Hat mir sehr bei einem Problem weitergeholfen, auf das ich beim Parsen meiner Karte für ein 2D Spiel gestoßen bin.

  8. 8 XamGreen said at 10:25 on September 6th, 2013:

    Einfach Bombe, danke für das schöne Tut. Weiter so!

  9. 9 sa said at 13:20 on Oktober 29th, 2013:

    sas

  10. 10 assas said at 13:20 on Oktober 29th, 2013:

    as

  11. 11 alert("Hello") said at 13:22 on Oktober 29th, 2013:

    fads

  12. 12 Bastinik said at 11:18 on November 16th, 2013:

    richtig gutes tut; es sollte mehr Leute wie dich geben

  13. 13 Jojo said at 18:41 on Februar 3rd, 2014:

    ich muss sagen ich finds gut, dass du dir die zeit genommen hast ein Tutorial für sax zu schreiben. ich selbst wollte es in einem größeren projekt verwenden, hab aber jetzt das problem, dass mir durch die benutzung jegliche kapselung verloren geht. das ist ja bei kleineren sachen kein problem, aber eine schöne lösung sieht, meiner meinung nach, anders aus. leider hab ich bis jetzt auch keine bessere lösung gefunden, als sich eine generator klasse zuschreiben die mir dann meine Klasse generiert. für jede klasse die ich abspeichern will eine generator klasse zuschreiben ist aber auch keine lösung.
    gibts da irgendwas was man machen kann? (ich übergebe die attribute der klasse im construktor, da ich nicht möchte, dass sie geändert werden können)

    gruß jojo

  14. 14 Problem said at 13:22 on Februar 17th, 2014:

    Vielen Dank für die Hilfestellung
    In der Methode characters() sollte ein allerdings ein Stringbuffer oder ähnliches verwendet werden da der SAX Parser grössere String je nach dem in kleinen Einzelteilen holt und man so nur den Schluss davon hat.

  15. 15 André said at 20:38 on Februar 25th, 2014:

    Danke für die gute Anleitung! Hat mir sehr geholfen.

  16. 16 Steckdosen Online said at 15:54 on Mai 28th, 2014:

    Hey gut gemachtes Tutorial, übersichtlicht und schnell zu lernen. Vorallem die OOP Umsetzung ist gelungen.

  17. 17 Du bonheur d'être réac-Manifeste jubilatoire de la réaction pdf said at 02:21 on Juni 18th, 2014:

    Hi, i read your blog from time to time and i own a similar one and i was
    just wondering if you get a lot of spam responses? If so
    how do you reduce it, any plugin or anything you can advise?
    I get so much lately it’s driving me mad so any
    assistance is very much appreciated.

    My page Du bonheur d’être réac-Manifeste jubilatoire de la réaction pdf

  18. 18 The Kindle Book Game | Jeff Boerboon Aerobatics said at 13:24 on Juni 20th, 2014:

    […] pdf download mobi mobi book kindle book telecharger pdf book pdf download telecharger Pdf – blog.mynotiz.de download Ebook Telecharger Pdf , mobi book telecharger pdf pdf download kindle book download ebook […]

  19. 19 Tilman said at 15:14 on Oktober 11th, 2016:

    Vielen Danke für das leicht verstädnliche Tutorial!


Leave a Reply