From f80fbd0037311523175bcf5afbf33801657939ad Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Sun, 19 May 2013 11:36:01 +0200 Subject: [PATCH] mixed content sax example --- .../Jdbc/src/main/java/sax/mixed/Driver.java | 17 +++++++ .../src/main/java/sax/mixed/MixedCount.java | 39 ++++++++++++++++ .../java/sax/mixed/MixedCountHandler.java | 45 +++++++++++++++++++ .../main/java/sax/mixed/MyErrorHandler.java | 25 +++++++++++ .../Jdbc/src/main/java/sax/mixed/mixed.xml | 7 +++ 5 files changed, 133 insertions(+) create mode 100644 ws/eclipse/Jdbc/src/main/java/sax/mixed/Driver.java create mode 100644 ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCount.java create mode 100644 ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCountHandler.java create mode 100644 ws/eclipse/Jdbc/src/main/java/sax/mixed/MyErrorHandler.java create mode 100644 ws/eclipse/Jdbc/src/main/java/sax/mixed/mixed.xml diff --git a/ws/eclipse/Jdbc/src/main/java/sax/mixed/Driver.java b/ws/eclipse/Jdbc/src/main/java/sax/mixed/Driver.java new file mode 100644 index 000000000..9e591b859 --- /dev/null +++ b/ws/eclipse/Jdbc/src/main/java/sax/mixed/Driver.java @@ -0,0 +1,17 @@ +package sax.mixed; + +/** Driver */ +public class Driver { + /** @param argv unused */ + public static void main(String argv[]) { + try{ + MixedCount xmlStats = new MixedCount(); + xmlStats.parse("src/main/java/sax/mixed/mixed.xml"); + + System.out.println("Document contains " + + xmlStats.getElementCount() + " text nodes within mixed content elements"); + } catch (Exception e){ + e.printStackTrace(System.err); + } + } +} \ No newline at end of file diff --git a/ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCount.java b/ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCount.java new file mode 100644 index 000000000..07506b583 --- /dev/null +++ b/ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCount.java @@ -0,0 +1,39 @@ +package sax.mixed; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; + +/** Parser, content- and errorhandler assembly */ +public class MixedCount { + /** @throws SAXException + * @throws ParserConfigurationException */ + public MixedCount() + throws SAXException, ParserConfigurationException{ + final SAXParserFactory saxPf = SAXParserFactory.newInstance(); + final SAXParser saxParser = saxPf.newSAXParser(); + xmlReader = saxParser.getXMLReader(); + xmlReader.setContentHandler(eventHandler); + xmlReader.setErrorHandler(errorHandler); + } + /** @see sax.stat.v1.ElementCount + * @param uri + * @throws IOException + * @throws SAXException */ + public void parse(final String uri) + throws IOException, SAXException{ + xmlReader.parse(uri); + } + /** @return @see sax.stat.v1.ElementCount#getElementCount() */ + public int getElementCount() { + return eventHandler.getMixedElementCount(); + } + private final XMLReader xmlReader; + private final MixedCountHandler eventHandler = new MixedCountHandler(); + private final MyErrorHandler errorHandler = new MyErrorHandler(); +} \ No newline at end of file diff --git a/ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCountHandler.java b/ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCountHandler.java new file mode 100644 index 000000000..ec697fd1c --- /dev/null +++ b/ws/eclipse/Jdbc/src/main/java/sax/mixed/MixedCountHandler.java @@ -0,0 +1,45 @@ +package sax.mixed; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class MixedCountHandler extends DefaultHandler { + + enum EventType {openElement, closeElement, character, idle}; + EventType lastEvent = EventType.idle; + + private int mixedElementCount = 0; + + @Override + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + if (lastEvent == EventType.character) { + mixedElementCount++; + } + lastEvent = EventType.openElement; + } + + @Override + public void endElement(String uri, String localName, String qName) + throws SAXException { + lastEvent = EventType.closeElement; + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + final String content = new String(ch, start, length); + + // We ignore whitespace completely + if (0 < content.trim().length()) { + if (lastEvent == EventType.closeElement) { + mixedElementCount++; + } + lastEvent = EventType.character; + } + } + + public int getMixedElementCount() { + return mixedElementCount; + } +} \ No newline at end of file diff --git a/ws/eclipse/Jdbc/src/main/java/sax/mixed/MyErrorHandler.java b/ws/eclipse/Jdbc/src/main/java/sax/mixed/MyErrorHandler.java new file mode 100644 index 000000000..66e64a4d8 --- /dev/null +++ b/ws/eclipse/Jdbc/src/main/java/sax/mixed/MyErrorHandler.java @@ -0,0 +1,25 @@ +package sax.mixed; + +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.ErrorHandler; + +/** Handle parsing errors */ +public class MyErrorHandler implements ErrorHandler { + /** @see ErrorHandler#warning(SAXParseException) */ + public void warning(SAXParseException e) { + System.err.println("[Warning]" + getLocationString(e)); + } + /** @see ErrorHandler#error(SAXParseException) */ + public void error(SAXParseException e) { + System.err.println("[Error]" + getLocationString(e)); + } + /** @see ErrorHandler#fatalError(SAXParseException) */ + public void fatalError(SAXParseException e) throws SAXException{ + System.err.println("[Fatal Error]" + getLocationString(e)); + } + private String getLocationString(SAXParseException e) { + return " line " + e.getLineNumber() + + ", column " + e.getColumnNumber()+ ":" + e.getMessage(); + } +} \ No newline at end of file diff --git a/ws/eclipse/Jdbc/src/main/java/sax/mixed/mixed.xml b/ws/eclipse/Jdbc/src/main/java/sax/mixed/mixed.xml new file mode 100644 index 000000000..e9487e8e2 --- /dev/null +++ b/ws/eclipse/Jdbc/src/main/java/sax/mixed/mixed.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<top> + <a>Test 1</a> + <b>Some <c>mixed</c> content</b> + <d><nothingMixed/></d> + <d> <nothingMixed/> </d> +</top> \ No newline at end of file -- GitLab