package com.ausregistry.jtoolkit2.xml; import java.util.logging.Logger; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; final class XMLBuilderW3C implements XMLBuilder { private static final int DEFAULT_DOC_SIZE = 4096; private static final String SPACE = " "; private static final String DEFAULT_VERSION = "1.0"; private static final String DEFAULT_ENCODING = "UTF-8"; private static final boolean DEFAULT_STANDALONE = false; private String version; private String encoding; private boolean standalone; private StringBuilder builder; private String pname; XMLBuilderW3C() { this(DEFAULT_VERSION, DEFAULT_ENCODING, DEFAULT_STANDALONE); } XMLBuilderW3C(String version, String encoding, boolean standalone) { pname = getClass().getPackage().getName(); this.version = version; this.encoding = encoding; this.standalone = standalone; builder = new StringBuilder(DEFAULT_DOC_SIZE); } public String toXML(Element root) { Logger.getLogger(pname + ".debug").finest("enter"); writeDeclaration(); dfs(root); Logger.getLogger(pname + ".debug").finest("exit"); return new String(builder); } public void dfs(Element e) { Logger.getLogger(pname + ".debug").finest("enter"); String name = e.getNodeName(); write("<"); write(name); String uri = e.getNamespaceURI(); Node parent = e.getParentNode(); Logger.getLogger(pname + ".debug").finer(uri); if (parent == null || (uri != null && !parent.getNamespaceURI().equals(uri))) { writeNS(uri); } if (e.hasAttributes()) { NamedNodeMap attributes = e.getAttributes(); for (int i = 0; i < attributes.getLength(); i++) { writeAttribute(attributes.item(i)); } } if (e.hasChildNodes()) { write(">"); NodeList children = e.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child instanceof Text) { write(child.getNodeValue()); } if (child instanceof Element) { dfs((Element) child); } } write("</"); write(name); write(">"); } else { write("/>"); } Logger.getLogger(pname + ".debug").finest("exit"); } private void writeDeclaration() { write("<?xml version=\""); write(version); write("\" encoding=\""); write(encoding); write("\" standalone=\""); write(standalone ? "yes\"" : "no\""); write("?>"); } private void writeNS(String uri) { write(SPACE); write("xmlns=\""); write(uri); write("\""); } private void writeAttribute(Node attr) { write(SPACE); write(attr.getNodeName()); write("=\""); write(attr.getNodeValue()); write("\""); } private void write(String s) { builder.append(s); } }