Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


XPath 3.0, XPath 2.0, XPath 1.0 / XML auswerten mit XPath, C#.NET und Java / Auswertung mit Java via org.xml.sax.XMLReader

Auswertung mit Java via org.xml.sax.XMLReader

Auswertung mit Java via org.xml.sax.XMLReader

➪ Diese Seite beschreibt anhand eines einfachen Beispiels verschiedene Möglichkeiten zur Auswertung von XML-Dokumenten in XPath/XSLT, C#.NET und Java.

Wenn Sie auch in Java auf XPath verzichten möchten, bleibt Ihnen beispielsweise die Alternative mit dem org.xml.sax.XMLReader, der einen separaten ContentHandler benötigt. In diesem ContentHandler, speziell in dessen Methoden startElement, endElement und characters finden Sie wesentliche Teile der Verarbeitungslogik.


import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
class SAX_ContentHandler implements ContentHandler  {
  private String ganzername      = "";
  private String aktenzeichen    = "";
  private String aktuellerstring = "";
  private boolean iscorrect      = false;
  private boolean isremark       = false;
  private int position           = 0;
  private XMLStreamWriter xstreamwriter=null;
  public SAX_ContentHandler(XMLStreamWriter pxstreamwriter) {
    this.xstreamwriter = pxstreamwriter;
  }
  public void setDocumentLocator(Locator locator) {}  
  public void startDocument() throws SAXException {}  
  public void endDocument() throws SAXException {}  
  public void startPrefixMapping(String prefix, 
                                 String uri) 
                                 throws SAXException {}  
  public void endPrefixMapping(String prefix) throws SAXException {}
  public void startElement(String uri, 
                           String localName, 
                           String qName, 
                           Attributes atts) 
                           throws SAXException {
    if(localName=="Name") {
      iscorrect=true;
      isremark=true;
      ganzername=atts.getValue("name");        
    }
    if(localName=="Bemerkung") {
      isremark=true;  
    }  
    if(localName=="Aktenzeichen") {
      isremark=false;  
    }
  }
  public void endElement(String uri, 
                         String localName, 
                         String qName) 
                         throws SAXException {
    if(localName=="Name") {
      isremark=false;  
      if(iscorrect) {
        position++;        
        try {
          xstreamwriter.writeStartElement("Mensch");
          xstreamwriter.writeAttribute("name", ganzername);
          xstreamwriter.writeAttribute("az", aktenzeichen);
          xstreamwriter.writeAttribute("nr", Integer.toString(position));
          xstreamwriter.writeEndElement();
        } catch (XMLStreamException e) {
          e.printStackTrace();
        }
      }
    }
    if(localName=="Aktenzeichen") {      
      if(iscorrect) {
        aktenzeichen = aktuellerstring;        
      }      
    }  
  }
  public void characters(char[] ch, 
                         int start, 
                         int length) throws SAXException {
    aktuellerstring = new String(ch).substring(start, start + length);    
    if(isremark && aktuellerstring.equals("LQ")) {
      iscorrect=false;
    }
  }
  public void ignorableWhitespace(char[] ch, 
                                  int start, 
                                  int length) 
                                  throws SAXException {}  
  public void processingInstruction(String target, 
                                    String data) 
                                    throws SAXException {}  
  public void skippedEntity(String name) throws SAXException {}
}

Um die Ansätze vergleichen zu können, arbeite ich bei der Ausgabe mit javax.xml.stream.XmlStreamWriter. Dessen Instanz wird in der folgenden Logik erzeugt und dem SAX_ContentHandler via Konstruktor übergeben. Damit kann das XML-Dokument ausgewertet werden:


public static void readXML_SAX()
{
  XMLOutputFactory xoutputfactory =  XMLOutputFactory.newInstance();
  SAX_ContentHandler ch=null;
  try {
      XMLStreamWriter xstreamwriter = null;
      xstreamwriter = xoutputfactory.createXMLStreamWriter(System.out);
      ch = new SAX_ContentHandler(xstreamwriter);
      XMLReader r = XMLReaderFactory.createXMLReader();
      r.setContentHandler(ch);
      xstreamwriter.writeStartDocument("utf-8","1.0");
      xstreamwriter.writeStartElement("ergebnis");
      r.parse("(inputdokument)");
      xstreamwriter.writeEndElement();
      xstreamwriter.writeEndDocument();
      xstreamwriter.flush();
      xstreamwriter.close();
  } catch (XMLStreamException e) {
    e.printStackTrace();
  } catch (SAXException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

wg / 26. Januar 2019



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/xpath_cs_java_Auswertung6.html