aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-09-26 17:47:01 +0100
committerMichael Williamson <mike@zwobble.org>2015-09-26 17:47:01 +0100
commit53f27cf1a80151bbf06fa9e900c744f06e907f77 (patch)
tree31d98e1edb239e49b29a326573d53aabfa03eafa /src
parente0cf7240fe37c5f44b66563db29c07bc1188805b (diff)
Allow namespacing mapping in element names
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/xml/XmlParser.java13
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java37
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"))));
+ }
}