aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefix.java21
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/xml/NamespacePrefixes.java15
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/xml/parsing/XmlParser.java4
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/xml/XmlParserTests.java27
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(