diff --git a/src/main/org/apache/tools/ant/util/DOMElementWriter.java b/src/main/org/apache/tools/ant/util/DOMElementWriter.java index 786ac6dd4..a7b6d6718 100644 --- a/src/main/org/apache/tools/ant/util/DOMElementWriter.java +++ b/src/main/org/apache/tools/ant/util/DOMElementWriter.java @@ -33,6 +33,7 @@ import org.w3c.dom.Text; /** * Writes a DOM tree to a given Writer. + * warning: this utility currently does not declare XML Namespaces. *
Utility class used by {@link org.apache.tools.ant.XmlLogger * XmlLogger} and * org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter @@ -278,7 +279,8 @@ public class DOMElementWriter { // Write element out.write("<"); if (namespacePolicy.qualifyElements) { - String prefix = (String) nsPrefixMap.get(element.getNamespaceURI()); + String uri = getNamespaceURI(element); + String prefix = (String) nsPrefixMap.get(uri); if (prefix == null) { if (nsPrefixMap.isEmpty()) { // steal default namespace @@ -286,8 +288,8 @@ public class DOMElementWriter { } else { prefix = NS + (nextPrefix++); } - nsPrefixMap.put(element.getNamespaceURI(), prefix); - addNSDefinition(element, element.getNamespaceURI()); + nsPrefixMap.put(uri, prefix); + addNSDefinition(element, uri); } if (!"".equals(prefix)) { out.write(prefix); @@ -302,12 +304,12 @@ public class DOMElementWriter { Attr attr = (Attr) attrs.item(i); out.write(" "); if (namespacePolicy.qualifyAttributes) { - String prefix = - (String) nsPrefixMap.get(attr.getNamespaceURI()); + String uri = getNamespaceURI(attr); + String prefix = (String) nsPrefixMap.get(uri); if (prefix == null) { prefix = NS + (nextPrefix++); - nsPrefixMap.put(attr.getNamespaceURI(), prefix); - addNSDefinition(element, attr.getNamespaceURI()); + nsPrefixMap.put(uri, prefix); + addNSDefinition(element, uri); } out.write(prefix); out.write(":"); @@ -370,10 +372,9 @@ public class DOMElementWriter { // Write element close out.write(""); - if (namespacePolicy.qualifyElements - || namespacePolicy.qualifyAttributes) { - String prefix = - (String) nsPrefixMap.get(element.getNamespaceURI()); + if (namespacePolicy.qualifyElements) { + String uri = getNamespaceURI(element); + String prefix = (String) nsPrefixMap.get(uri); if (prefix != null && !"".equals(prefix)) { out.write(prefix); out.write(":"); @@ -548,4 +549,13 @@ public class DOMElementWriter { } al.add(uri); } + + private static String getNamespaceURI(Node n) { + String uri = n.getNamespaceURI(); + if (uri == null) { + // FIXME: Is "No Namespace is Empty Namespace" really OK? + uri = ""; + } + return uri; + } }