XML als Datenaustauschformat / XML auswerten mit Java-SAX

XML auswerten mit Java-SAX

XML auswerten mit Java-SAX

➪ SAX erfordert eine Handler-Routine, die das Interface ContentHandler implementiert.

Aufgabe: ein XML-Dokument soll mit SAX ausgelesen werden: Die Elemente vorname und name sollen bei jedem Mensch in ein Objekt der Klasse Person eingelesen werden. Die restlichen Informationen werden ignoriert. Sämtliche so generierten Person-Instanzen sollen in einem Vector gelistet werden. Die notwendigen Objekte habe ich in diese Handler-Routine aufgenommen.


import java.util.Vector;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class SAX_ContentHandler implements ContentHandler  {
  private Vector<Person> liste = new Vector<Person>();
  private Person p=null;
  private boolean isPerson=false;
  private boolean isVorname=false;
  private boolean isNachname=false;
  public Vector<Person> getVector(){
    return this.liste;
  }
  public SAX_ContentHandler() {
  }  
  public void startPrefixMapping(String arg0, String arg1)
      throws SAXException {    
  }
  public void startDocument() throws SAXException {
  }
  public void skippedEntity(String arg0) throws SAXException {
  }
  public void processingInstruction(String arg0, String arg1)
      throws SAXException {
  }
  public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
      throws SAXException {
  }
  public void endPrefixMapping(String arg0) throws SAXException {
  }
  public void endElement(String arg0, String arg1, String arg2) 
      throws SAXException {
    //System.out.println("EndElement: " + arg1);    
    if(arg1 == "Mensch"){
      //System.out.println("Ende MENSCH");
      isPerson=false;
      liste.add(p);
    }
    if(isPerson){
      if(arg1=="name") isNachname=false;
      if(arg1=="vorname") isVorname=false;
    }
  }
  public void endDocument() throws SAXException {
  }
  public void characters(char[] arg0, int arg1, int arg2) 
      throws SAXException {
    String s = new String(arg0).substring(arg1, arg1 + arg2);
    if(isPerson){      
      //System.out.println("\tcharacters: " + s );  
    }
    if(isNachname){
      p.setLastname(s);
    }
    if(isVorname){
      p.setFirstname(s);
    }
  }
  public void setDocumentLocator(Locator arg0) {    
  }
  public void startElement(String arg0, String arg1, 
      String arg2, Attributes arg3) 
      throws SAXException {
    //System.out.println("StartElement: " + arg1);  
    if(arg1=="Mensch"){
      //System.out.println("ANFANG Mensch");
      p = new Person();
      p.setA(0);
      isPerson=true;
    }
    if(arg1=="Kauf"){
      //System.out.println("ANFANG Kauf");
      isPerson=false;
    }
    if(isPerson){
      if(arg1=="name") isNachname=true;
      if(arg1=="vorname") isVorname=true;
    }
  }
}

Der eigentliche Aufruf erfolgt in der unten dargestellten Logik. Die Instanz der Klasse XMLReader wird über die org.xml.sax.helpers.XMLReaderFactory generiert. Der Vector kommt aus dem oben beschriebenen Contenthandler.


    try {
      SAX_ContentHandler ch = new SAX_ContentHandler();
      XMLReader r = XMLReaderFactory.createXMLReader();
      r.setContentHandler(ch);
      r.parse("C:/wg/Ort_Elemente.xml");
      System.out.println("AUSGABE");
      Vector v = ch.getVector();
      for(int i=0; i<v.size();i++){
        Person p = (Person) v.get(i);
        System.out.println(p.getFirstname() 
                           + " " +  p.getLastname());
      }      
    } catch (SAXException e) {
    } catch (IOException e) {
    }

Den SAXReader können Sie auch mit einem Validierungsprozess (XML-Schema) verbinden. Der hierfür zuständige Handler kann in der bereits beschriebenen Klasse MyErrorHandler bestehen. Dabei wird das XML-Dokument gelesen und separat validiert. Validierungsfehler werden lediglich reportet, sie unterbrechen oder beenden aber nicht den Lese-Vorgang.


    try {
      SAXParserFactory factory = SAXParserFactory.newInstance();
      factory.setValidating(false);
      factory.setNamespaceAware(true);
      SchemaFactory schemaFactory = 
        SchemaFactory.newInstance(
                      "http://www.w3.org/2001/XMLSchema");      
      Schema schema = schemaFactory.newSchema(
        new File("C:/wg/Ort_Elemente.xsd"));
      factory.setSchema(schema);
      SAXParser parser = factory.newSAXParser();      
      XMLReader r = parser.getXMLReader();      
      SAX_ContentHandler ch = new SAX_ContentHandler();
      MyErrorHandler eh = new MyErrorHandler();
      r.setContentHandler(ch);
      r.setErrorHandler(eh);  
      r.parse("C:/wg/Ort_Elemente.xml");
      eh.closeFileWriter();
      System.out.println("AUSGABE");
      Vector v = ch.getVector();
      for(int i=0; i<v.size();i++){
        Person p = (Person) v.get(i);
        System.out.println(p.getFirstname() 
                           + " " +  p.getLastname());
      }    

wg / 3. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/SAX.html