@@ -33,6 +33,7 @@ import org.w3c.dom.Text;
/**
/**
* Writes a DOM tree to a given Writer.
* Writes a DOM tree to a given Writer.
* warning: this utility currently does not declare XML Namespaces.
* <p>Utility class used by {@link org.apache.tools.ant.XmlLogger
* <p>Utility class used by {@link org.apache.tools.ant.XmlLogger
* XmlLogger} and
* XmlLogger} and
* org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter
* org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter
@@ -278,7 +279,8 @@ public class DOMElementWriter {
// Write element
// Write element
out.write("<");
out.write("<");
if (namespacePolicy.qualifyElements) {
if (namespacePolicy.qualifyElements) {
String prefix = (String) nsPrefixMap.get(element.getNamespaceURI());
String uri = getNamespaceURI(element);
String prefix = (String) nsPrefixMap.get(uri);
if (prefix == null) {
if (prefix == null) {
if (nsPrefixMap.isEmpty()) {
if (nsPrefixMap.isEmpty()) {
// steal default namespace
// steal default namespace
@@ -286,8 +288,8 @@ public class DOMElementWriter {
} else {
} else {
prefix = NS + (nextPrefix++);
prefix = NS + (nextPrefix++);
}
}
nsPrefixMap.put(element.getNamespaceURI() , prefix);
addNSDefinition(element, element.getNamespaceURI() );
nsPrefixMap.put(uri , prefix);
addNSDefinition(element, uri );
}
}
if (!"".equals(prefix)) {
if (!"".equals(prefix)) {
out.write(prefix);
out.write(prefix);
@@ -302,12 +304,12 @@ public class DOMElementWriter {
Attr attr = (Attr) attrs.item(i);
Attr attr = (Attr) attrs.item(i);
out.write(" ");
out.write(" ");
if (namespacePolicy.qualifyAttributes) {
if (namespacePolicy.qualifyAttributes) {
String prefix =
(String) nsPrefixMap.get(attr.getNamespaceURI() );
String uri = getNamespaceURI(attr);
String prefix = (String) nsPrefixMap.get(uri );
if (prefix == null) {
if (prefix == null) {
prefix = NS + (nextPrefix++);
prefix = NS + (nextPrefix++);
nsPrefixMap.put(attr.getNamespaceURI() , prefix);
addNSDefinition(element, attr.getNamespaceURI() );
nsPrefixMap.put(uri , prefix);
addNSDefinition(element, uri );
}
}
out.write(prefix);
out.write(prefix);
out.write(":");
out.write(":");
@@ -370,10 +372,9 @@ public class DOMElementWriter {
// Write element close
// Write element close
out.write("</");
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)) {
if (prefix != null && !"".equals(prefix)) {
out.write(prefix);
out.write(prefix);
out.write(":");
out.write(":");
@@ -548,4 +549,13 @@ public class DOMElementWriter {
}
}
al.add(uri);
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;
}
}
}