aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/xml/parsing/SimpleSax.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-12-31 16:08:16 +0000
committerMichael Williamson <mike@zwobble.org>2015-12-31 16:08:16 +0000
commit36deaa6002a0e85d7da6efd7e569d91f976d9949 (patch)
treecf76ee1e00e9753e9954985afdedcd253681a550 /src/main/java/org/zwobble/mammoth/xml/parsing/SimpleSax.java
parentd91ddfe924176707062ce447722993d9d9aac415 (diff)
Move XML parsing code into its own package
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/xml/parsing/SimpleSax.java')
-rw-r--r--src/main/java/org/zwobble/mammoth/xml/parsing/SimpleSax.java64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/mammoth/xml/parsing/SimpleSax.java b/src/main/java/org/zwobble/mammoth/xml/parsing/SimpleSax.java
new file mode 100644
index 0000000..5b7957d
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/xml/parsing/SimpleSax.java
@@ -0,0 +1,64 @@
+package org.zwobble.mammoth.xml.parsing;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.util.Map;
+import java.util.stream.IntStream;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+import static java.util.stream.Collectors.toMap;
+
+class SimpleSax {
+ static void parseStream(InputStream input, SimpleSaxHandler handler) {
+ parseInputSource(new InputSource(input), handler);
+ }
+
+ static void parseString(String value, SimpleSaxHandler handler) {
+ parseInputSource(new InputSource(new StringReader(value)), handler);
+ }
+
+ private static void parseInputSource(InputSource inputSource, SimpleSaxHandler handler) {
+ SAXParserFactory parserFactory = SAXParserFactory.newInstance();
+ parserFactory.setNamespaceAware(true);
+ try {
+ SAXParser saxParser = parserFactory.newSAXParser();
+ XMLReader xmlReader = saxParser.getXMLReader();
+ xmlReader.setContentHandler(new DefaultHandler() {
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ ElementName name = new ElementName(uri, localName);
+ Map<ElementName, String> attributesMap = IntStream.range(0, attributes.getLength())
+ .boxed()
+ .collect(toMap(
+ index -> new ElementName(attributes.getURI(index), attributes.getLocalName(index)),
+ attributes::getValue
+ ));
+ handler.startElement(name, attributesMap);
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ handler.endElement();
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ handler.characters(new String(ch, start, length));
+ }
+ });
+ xmlReader.parse(inputSource);
+ } catch (ParserConfigurationException | SAXException | IOException exception) {
+ throw new RuntimeException(exception);
+ }
+ }
+}