From 34cb98fb564d82e185103c85ead8443a7d551c6b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 13 Nov 2016 21:37:50 +0000 Subject: Allow default namespace when parsing XML --- .../mammoth/internal/xml/NamespacePrefix.java | 21 +++++++++++++++++ .../mammoth/internal/xml/NamespacePrefixes.java | 15 ++++++++---- .../mammoth/internal/xml/parsing/XmlParser.java | 4 ++-- .../zwobble/mammoth/tests/xml/XmlParserTests.java | 27 ++++++++++++++-------- 4 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefix.java (limited to 'src') 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 prefix; + private final String uri; + + public NamespacePrefix(Optional prefix, String uri) { + this.prefix = prefix; + this.uri = uri; + } + + public Optional 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 uriToPrefix = new HashMap<>(); + private final Map 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 uriToPrefix; + private final Map uriToPrefix; - public NamespacePrefixes(Map uriToPrefix) { + public NamespacePrefixes(Map uriToPrefix) { this.uriToPrefix = uriToPrefix; } - public Optional prefixForUri(String uri) { + public Optional 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(""), isElement("values")); } - + @Test public void canParseEmptyElementWithSeparateClosingTag() { assertThat( parser.parseString(""), isElement("body")); } - + @Test public void canParseAttributesOfTag() { assertThat( parser.parseString(""), 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(""), isElement("{word}body")); } - + @Test public void unmappedNamespaceUrisInAttributeNamesAreIncludedInBracesAsPrefix() { assertThat( parser.parseString(""), 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(""), 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(""), isElement("body", map("x:name", "bob"))); } - + + @Test + public void elementsWithDefaultNamespaceHaveNoPrefix() { + XmlParser parser = new XmlParser(NamespacePrefixes.builder().defaultPrefix("word").build()); + assertThat( + parser.parseString(""), + isElement("body") + ); + } + @Test public void canParseInputStream() { assertThat( -- cgit v1.2.3