in batik-dom/src/main/java/org/apache/batik/dom/util/DOMUtilities.java [189:362]
protected static void writeNode(Node n, Writer w, NSMap m, boolean isXML11)
throws IOException {
switch (n.getNodeType()) {
case Node.ELEMENT_NODE: {
if (n.hasAttributes()) {
NamedNodeMap attr = n.getAttributes();
int len = attr.getLength();
for (int i = 0; i < len; i++) {
Attr a = (Attr)attr.item(i);
String name = a.getNodeName();
if (name.startsWith("xmlns")) {
if (name.length() == 5) {
m = m.declare("", a.getNodeValue());
} else {
String prefix = name.substring(6);
m = m.declare(prefix, a.getNodeValue());
}
}
}
}
w.write('<');
String ns = n.getNamespaceURI();
String tagName;
if (ns == null) {
tagName = n.getNodeName();
w.write(tagName);
if (!"".equals(m.getNamespace(""))) {
w.write(" xmlns=\"\"");
m = m.declare("", "");
}
} else {
String prefix = n.getPrefix();
if (prefix == null) {
prefix = "";
}
if (ns.equals(m.getNamespace(prefix))) {
tagName = n.getNodeName();
w.write(tagName);
} else {
prefix = m.getPrefixForElement(ns);
if (prefix == null) {
prefix = m.getNewPrefix();
tagName = prefix + ':' + n.getLocalName();
w.write(tagName + " xmlns:" + prefix + "=\""
+ contentToString(ns, isXML11) + '"');
m = m.declare(prefix, ns);
} else {
if (prefix.equals("")) {
tagName = n.getLocalName();
} else {
tagName = prefix + ':' + n.getLocalName();
}
w.write(tagName);
}
}
}
if (n.hasAttributes()) {
NamedNodeMap attr = n.getAttributes();
int len = attr.getLength();
for (int i = 0; i < len; i++) {
Attr a = (Attr)attr.item(i);
String name = a.getNodeName();
String prefix = a.getPrefix();
String ans = a.getNamespaceURI();
if (ans != null &&
!("xmlns".equals(prefix) || name.equals("xmlns"))) {
if (prefix != null
&& !ans.equals(m.getNamespace(prefix))
|| prefix == null) {
prefix = m.getPrefixForAttr(ans);
if (prefix == null) {
prefix = m.getNewPrefix();
m = m.declare(prefix, ans);
w.write(" xmlns:" + prefix + "=\""
+ contentToString(ans, isXML11) + '"');
}
name = prefix + ':' + a.getLocalName();
}
}
w.write(' ' + name + "=\""
+ contentToString(a.getNodeValue(), isXML11)
+ '"');
}
}
Node c = n.getFirstChild();
if (c != null) {
w.write('>');
do {
writeNode(c, w, m, isXML11);
c = c.getNextSibling();
} while (c != null);
w.write("</" + tagName + '>');
} else {
w.write("/>");
}
break;
}
case Node.TEXT_NODE:
w.write(contentToString(n.getNodeValue(), isXML11));
break;
case Node.CDATA_SECTION_NODE: {
String data = n.getNodeValue();
if (data.indexOf("]]>") != -1) {
throw new IOException("Unserializable CDATA section node");
}
w.write("<![CDATA["
+ assertValidCharacters(data, isXML11)
+ "]]>");
break;
}
case Node.ENTITY_REFERENCE_NODE:
w.write('&' + n.getNodeName() + ';');
break;
case Node.PROCESSING_INSTRUCTION_NODE: {
String target = n.getNodeName();
String data = n.getNodeValue();
if (target.equalsIgnoreCase("xml")
|| target.indexOf(':') != -1
|| data.indexOf("?>") != -1) {
throw new
IOException("Unserializable processing instruction node");
}
w.write("<?" + target + ' ' + data + "?>");
break;
}
case Node.COMMENT_NODE: {
w.write("<!--");
String data = n.getNodeValue();
int len = data.length();
if (len != 0 && data.charAt(len - 1) == '-'
|| data.indexOf("--") != -1) {
throw new IOException("Unserializable comment node");
}
w.write(data);
w.write("-->");
break;
}
case Node.DOCUMENT_TYPE_NODE: {
DocumentType dt = (DocumentType)n;
w.write("<!DOCTYPE "
+ n.getOwnerDocument().getDocumentElement().getNodeName());
String pubID = dt.getPublicId();
if (pubID != null) {
char q = getUsableQuote(pubID);
if (q == 0) {
throw new IOException("Unserializable DOCTYPE node");
}
w.write(" PUBLIC " + q + pubID + q);
}
String sysID = dt.getSystemId();
if (sysID != null) {
char q = getUsableQuote(sysID);
if (q == 0) {
throw new IOException("Unserializable DOCTYPE node");
}
if (pubID == null) {
w.write(" SYSTEM");
}
w.write(" " + q + sysID + q);
}
String subset = dt.getInternalSubset();
if (subset != null) {
w.write('[' + subset + ']');
}
w.write('>');
break;
}
default:
throw new IOException("Unknown DOM node type " + n.getNodeType());
}
}