Mega Code Archive

 
Categories / Java / XML
 

DOM serializer

import java.io.IOException; import java.io.Writer; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class MainClass {   static private String indent = "";   public static Writer writer;   public static void serialize(Document doc) throws IOException {     serializeNode(doc, "");     writer.flush();   }   private static void serializeNode(Node node, String indentLevel) throws IOException {     switch (node.getNodeType()) {     case Node.DOCUMENT_NODE:       Document doc = (Document) node;       writer.write("<?xml version=\"");       writer.write(doc.getXmlVersion());       writer.write("\" encoding=\"UTF-8\" standalone=\"");       if (doc.getXmlStandalone())         writer.write("yes");       else         writer.write("no");       writer.write("\"?>\n");       NodeList nodes = node.getChildNodes();       if (nodes != null)         for (int i = 0; i < nodes.getLength(); i++)           serializeNode(nodes.item(i), "");       break;     case Node.ELEMENT_NODE:       String name = node.getNodeName();       writer.write(indentLevel + "<" + name);       NamedNodeMap attributes = node.getAttributes();       for (int i = 0; i < attributes.getLength(); i++) {         Node current = attributes.item(i);         writer.write(" " + current.getNodeName() + "=\"");         print(current.getNodeValue());         writer.write("\"");       }       writer.write(">");       NodeList children = node.getChildNodes();       if (children != null) {         if ((children.item(0) != null) && (children.item(0).getNodeType() == Node.ELEMENT_NODE))           writer.write("\n");         for (int i = 0; i < children.getLength(); i++)           serializeNode(children.item(i), indentLevel + indent);         if ((children.item(0) != null)             && (children.item(children.getLength() - 1).getNodeType() == Node.ELEMENT_NODE))           writer.write(indentLevel);       }       writer.write("</" + name + ">\n");       break;     case Node.TEXT_NODE:       print(node.getNodeValue());       break;     case Node.CDATA_SECTION_NODE:       writer.write("CDATA");       print(node.getNodeValue());       writer.write("");       break;     case Node.COMMENT_NODE:       writer.write(indentLevel + "<!-- " + node.getNodeValue() + " -->\n");       break;     case Node.PROCESSING_INSTRUCTION_NODE:       writer.write("<?" + node.getNodeName() + " " + node.getNodeValue() + "?>\n");       break;     case Node.ENTITY_REFERENCE_NODE:       writer.write("&" + node.getNodeName() + ";");       break;     case Node.DOCUMENT_TYPE_NODE:       DocumentType docType = (DocumentType) node;       String publicId = docType.getPublicId();       String systemId = docType.getSystemId();       String internalSubset = docType.getInternalSubset();       writer.write("<!DOCTYPE " + docType.getName());       if (publicId != null)         writer.write(" PUBLIC \"" + publicId + "\" ");       else         writer.write(" SYSTEM ");       writer.write("\"" + systemId + "\"");       if (internalSubset != null)         writer.write(" [" + internalSubset + "]");       writer.write(">\n");       break;     }   }   private static void print(String s) throws IOException {     if (s == null)       return;     for (int i = 0, len = s.length(); i < len; i++) {       char c = s.charAt(i);       switch (c) {       case '<':         writer.write("&lt;");         break;       case '>':         writer.write("&gt;");         break;       case '&':         writer.write("&amp;");         break;       case '\r':         writer.write("&#xD;");         break;       default:         writer.write(c);       }     }   } }