diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/xml/XmlParser.java | 13 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java | 37 |
2 files changed, 40 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/mammoth/xml/XmlParser.java b/src/main/java/org/zwobble/mammoth/xml/XmlParser.java index 5b26de3..064634a 100644 --- a/src/main/java/org/zwobble/mammoth/xml/XmlParser.java +++ b/src/main/java/org/zwobble/mammoth/xml/XmlParser.java @@ -5,19 +5,26 @@ import java.util.Deque; import java.util.Map; import com.google.common.base.Strings; +import com.google.common.collect.BiMap; import static java.util.stream.Collectors.toMap; import lombok.val; public class XmlParser { - public static XmlElement parseString(String value) { + private final BiMap<String, String> namespaces; + + public XmlParser(BiMap<String, String> namespaces) { + this.namespaces = namespaces; + } + + public XmlElement parseString(String value) { val nodeGenerator = new NodeGenerator(); SimpleSax.parseString(value, nodeGenerator); return nodeGenerator.getRoot(); } - private static class NodeGenerator implements SimpleSaxHandler { + private class NodeGenerator implements SimpleSaxHandler { private final Deque<XmlElementBuilder> elementStack; public NodeGenerator() { @@ -43,6 +50,8 @@ public class XmlParser { private String readName(ElementName name) { if (Strings.isNullOrEmpty(name.getUri())) { return name.getLocalName(); + } else if (namespaces.containsValue(name.getUri())) { + return namespaces.inverse().get(name.getUri()) + ":" + name.getLocalName(); } else { return "{" + name.getUri() + "}" + name.getLocalName(); } diff --git a/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java b/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java index ff5072f..6b3343d 100644 --- a/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java @@ -5,41 +5,46 @@ import org.zwobble.mammoth.xml.XmlElement; import org.zwobble.mammoth.xml.XmlParser; import org.zwobble.mammoth.xml.XmlTextNode; +import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; +import lombok.val; + public class XmlParserTests { + private final XmlParser parser = new XmlParser(ImmutableBiMap.of()); + @Test public void canParseSelfClosingElement() { assertThat( - XmlParser.parseString("<body/>"), + parser.parseString("<body/>"), is(new XmlElement("body"))); assertThat( - XmlParser.parseString("<values/>"), + parser.parseString("<values/>"), is(new XmlElement("values"))); } @Test public void canParseEmptyElementWithSeparateClosingTag() { assertThat( - XmlParser.parseString("<body></body>"), + parser.parseString("<body></body>"), is(new XmlElement("body"))); } @Test public void canParseAttributesOfTag() { assertThat( - XmlParser.parseString("<body name='bob'></body>"), + parser.parseString("<body name='bob'></body>"), is(new XmlElement("body", ImmutableMap.of("name", "bob")))); } @Test public void canParseElementWithDescendantElements() { assertThat( - XmlParser.parseString("<body><a><b/></a><a/></body>"), + parser.parseString("<body><a><b/></a><a/></body>"), is(new XmlElement("body", ImmutableMap.of(), ImmutableList.of( new XmlElement("a", ImmutableMap.of(), ImmutableList.of( new XmlElement("b") @@ -51,7 +56,7 @@ public class XmlParserTests { @Test public void canParseTextNodes() { assertThat( - XmlParser.parseString("<body>Hello!</body>"), + parser.parseString("<body>Hello!</body>"), is(new XmlElement("body", ImmutableMap.of(), ImmutableList.of( new XmlTextNode("Hello!") )))); @@ -60,14 +65,30 @@ public class XmlParserTests { @Test public void unmappedNamespaceUrisInElementNamesAreIncludedInBracesAsPrefix() { assertThat( - XmlParser.parseString("<w:body xmlns:w='word'/>"), + parser.parseString("<w:body xmlns:w='word'/>"), is(new XmlElement("{word}body"))); } @Test public void unmappedNamespaceUrisInAttributeNamesAreIncludedInBracesAsPrefix() { assertThat( - XmlParser.parseString("<body xmlns:w='word' w:name='bob'></body>"), + parser.parseString("<body xmlns:w='word' w:name='bob'></body>"), is(new XmlElement("body", ImmutableMap.of("{word}name", "bob")))); } + + @Test + public void mappedNamespaceUrisInElementNamesArePrefixedToLocalNameWithColon() { + val parser = new XmlParser(ImmutableBiMap.of("x", "word")); + assertThat( + parser.parseString("<w:body xmlns:w='word'/>"), + is(new XmlElement("x:body"))); + } + + @Test + public void mappedNamespaceUrisInAttributeNamesArePrefixedToLocalNameWithColon() { + val parser = new XmlParser(ImmutableBiMap.of("x", "word")); + assertThat( + parser.parseString("<body xmlns:w='word' w:name='bob'/>"), + is(new XmlElement("body", ImmutableMap.of("x:name", "bob")))); + } } |
