diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-09-26 17:33:13 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-09-26 17:33:13 +0100 |
| commit | be6fbc6f4e2f80552d3a7bab8677066d1fc858fc (patch) | |
| tree | 365f33cb3c09e838ff7bfab33609c919b73508ac /src/main/java/org/zwobble/mammoth/xml/XmlParser.java | |
| parent | 0cdeb56333f61fc5769749106496106cfd8ffbfe (diff) | |
Add simple XML parsing
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/xml/XmlParser.java')
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/xml/XmlParser.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/mammoth/xml/XmlParser.java b/src/main/java/org/zwobble/mammoth/xml/XmlParser.java new file mode 100644 index 0000000..360c174 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/xml/XmlParser.java @@ -0,0 +1,54 @@ +package org.zwobble.mammoth.xml; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Map; + +import static java.util.stream.Collectors.toMap; + +import lombok.val; + +public class XmlParser { + public static XmlElement parseString(String value) { + val nodeGenerator = new NodeGenerator(); + SimpleSax.parseString(value, nodeGenerator); + return nodeGenerator.getRoot(); + } + + private static class NodeGenerator implements SimpleSaxHandler { + private final Deque<XmlElementBuilder> elementStack; + + public NodeGenerator() { + elementStack = new ArrayDeque<>(); + } + + public XmlElement getRoot() { + return elementStack.getFirst().build(); + } + + @Override + public void startElement(ElementName name, Map<ElementName, String> attributes) { + val simpleAttributes = attributes + .entrySet() + .stream() + .collect(toMap( + entry -> entry.getKey().getLocalName(), + entry -> entry.getValue())); + val element = new XmlElementBuilder(name.getLocalName(), simpleAttributes); + elementStack.add(element); + } + + @Override + public void endElement() { + if (elementStack.size() > 1) { + val element = elementStack.removeLast(); + elementStack.getLast().addChild(element.build()); + } + } + + @Override + public void characters(String string) { + elementStack.getLast().addChild(new XmlTextNode(string)); + } + } +} |
