diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-11-13 21:37:50 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-11-13 21:39:16 +0000 |
| commit | 34cb98fb564d82e185103c85ead8443a7d551c6b (patch) | |
| tree | 1883ca00e04dce6b11511bdd18954ac3afa4d777 | |
| parent | 6f87042576150fd65db52144417d8a788f2441f4 (diff) | |
Allow default namespace when parsing XML
4 files changed, 51 insertions, 16 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefix.java b/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefix.java new file mode 100644 index 0000000..2e0c96f --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefix.java @@ -0,0 +1,21 @@ +package org.zwobble.mammoth.internal.xml; + +import java.util.Optional; + +public class NamespacePrefix { + private final Optional<String> prefix; + private final String uri; + + public NamespacePrefix(Optional<String> prefix, String uri) { + this.prefix = prefix; + this.uri = uri; + } + + public Optional<String> getPrefix() { + return prefix; + } + + public String getUri() { + return uri; + } +} diff --git a/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java b/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java index 2287723..44e5676 100644 --- a/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java +++ b/src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java @@ -12,10 +12,15 @@ public class NamespacePrefixes { } public static class Builder { - private final Map<String, String> uriToPrefix = new HashMap<>(); + private final Map<String, NamespacePrefix> uriToPrefix = new HashMap<>(); public Builder put(String prefix, String uri) { - uriToPrefix.put(uri, prefix); + uriToPrefix.put(uri, new NamespacePrefix(Optional.of(prefix), uri)); + return this; + } + + public Builder defaultPrefix(String uri) { + uriToPrefix.put(uri, new NamespacePrefix(Optional.empty(), uri)); return this; } @@ -24,13 +29,13 @@ public class NamespacePrefixes { } } - private final Map<String, String> uriToPrefix; + private final Map<String, NamespacePrefix> uriToPrefix; - public NamespacePrefixes(Map<String, String> uriToPrefix) { + public NamespacePrefixes(Map<String, NamespacePrefix> uriToPrefix) { this.uriToPrefix = uriToPrefix; } - public Optional<String> prefixForUri(String uri) { + public Optional<NamespacePrefix> lookupUri(String uri) { return lookup(uriToPrefix, uri); } } diff --git a/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java b/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java index c76e989..83e9a1b 100644 --- a/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java +++ b/src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java @@ -53,8 +53,8 @@ public class XmlParser { if (isNullOrEmpty(name.getUri())) { return name.getLocalName(); } else { - return namespaces.prefixForUri(name.getUri()) - .map(prefix -> prefix + ":" + name.getLocalName()) + return namespaces.lookupUri(name.getUri()) + .map(namespace -> namespace.getPrefix().map(prefix -> prefix + ":").orElse("") + name.getLocalName()) .orElseGet(() -> "{" + 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 30b7c28..072482e 100644 --- a/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java @@ -21,7 +21,7 @@ import static org.zwobble.mammoth.internal.util.Maps.map; public class XmlParserTests { private final XmlParser parser = new XmlParser(new NamespacePrefixes(map())); - + @Test public void canParseSelfClosingElement() { assertThat( @@ -31,21 +31,21 @@ public class XmlParserTests { parser.parseString("<values/>"), isElement("values")); } - + @Test public void canParseEmptyElementWithSeparateClosingTag() { assertThat( parser.parseString("<body></body>"), isElement("body")); } - + @Test public void canParseAttributesOfTag() { assertThat( parser.parseString("<body name='bob'></body>"), isElement("body", map("name", "bob"))); } - + @Test public void canParseElementWithDescendantElements() { assertThat( @@ -63,21 +63,21 @@ public class XmlParserTests { isElement("body", map(), list( isTextNode("Hello!")))); } - + @Test public void unmappedNamespaceUrisInElementNamesAreIncludedInBracesAsPrefix() { assertThat( parser.parseString("<w:body xmlns:w='word'/>"), isElement("{word}body")); } - + @Test public void unmappedNamespaceUrisInAttributeNamesAreIncludedInBracesAsPrefix() { assertThat( parser.parseString("<body xmlns:w='word' w:name='bob'></body>"), isElement("body", map("{word}name", "bob"))); } - + @Test public void mappedNamespaceUrisInElementNamesArePrefixedToLocalNameWithColon() { XmlParser parser = new XmlParser(NamespacePrefixes.builder().put("x", "word").build()); @@ -85,7 +85,7 @@ public class XmlParserTests { parser.parseString("<w:body xmlns:w='word'/>"), isElement("x:body")); } - + @Test public void mappedNamespaceUrisInAttributeNamesArePrefixedToLocalNameWithColon() { XmlParser parser = new XmlParser(NamespacePrefixes.builder().put("x", "word").build()); @@ -93,7 +93,16 @@ public class XmlParserTests { parser.parseString("<body xmlns:w='word' w:name='bob'/>"), isElement("body", map("x:name", "bob"))); } - + + @Test + public void elementsWithDefaultNamespaceHaveNoPrefix() { + XmlParser parser = new XmlParser(NamespacePrefixes.builder().defaultPrefix("word").build()); + assertThat( + parser.parseString("<w:body xmlns:w='word'/>"), + isElement("body") + ); + } + @Test public void canParseInputStream() { assertThat( |
