DocWriter has a static method for writing XML documents with a writer
/** * Copyright (c) 2006-2010 Richard Rodgers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //package com.monad.homerun.util; import java.io.IOException; import java.io.Writer; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * DocWriter has a static method for writing XML documents with a writer */ public class DocWriter { // indentation constant: 2 spaces private static final String SINGLE_INDENT = " "; public static void writeNodeToStream(Node node, Writer out) throws IOException { serializeNode(node, out, ""); out.write('\n'); out.flush(); } /** * Writes a document to a stream * * @param doc * the XML docuument to write * @param out * the output stream to write to * @throws IOException */ public static void writeDocToStream( Document doc, Writer out ) throws IOException { serializeNode( doc, out, "" ); out.write( '\n' ); out.flush(); } private static void serializeNode( Node node, Writer out, String indent ) throws IOException { switch ( node.getNodeType() ) { case Node.DOCUMENT_NODE: out.write( "<?xml version=\"1.0\"?>" + '\n' ); writeNode( ((Document)node).getDocumentElement(), out, indent ); break; case Node.ELEMENT_NODE: writeNode( node, out, indent ); break; case Node.TEXT_NODE: out.write( node.getNodeValue() ); break; case Node.COMMENT_NODE: out.write( /*indent + */ "<!--" + node.getNodeValue() + "-->" ); break; default: System.out.println( "Got node: " + node.getNodeName() ); break; } } private static void writeNode( Node node, Writer out, String indent ) throws IOException { out.write( nodeWithAttrs( node, indent ) ); NodeList kids = node.getChildNodes(); if ( kids != null ) { if ( ( kids.item( 0 ) != null ) && ( kids.item( 0 ).getNodeType() == Node.ELEMENT_NODE ) ) { out.write( '\n' ); } for ( int i = 0; i < kids.getLength(); i++ ) { serializeNode( kids.item( i ), out, indent + SINGLE_INDENT ); } /* RLR - bug in indent logic - seems to work OK without if ( ( kids.item( 0 ) != null ) && ( kids.item( kids.getLength()-1).getNodeType() == Node.ELEMENT_NODE ) ) { out.write( indent ); } */ } if ( node.hasChildNodes() ) { /* indent bug - leave out if ( kids.item( 0 ) != null && kids.item( 0 ).getNodeType() == Node.ELEMENT_NODE ) { out.write( indent ); } */ out.write( "</" + node.getNodeName() + ">" ); } } private static String nodeWithAttrs( Node node, String indent ) { StringBuffer sb = new StringBuffer(); // indent bug - leave out //sb.append( indent ); sb.append( "<" ); sb.append( node.getNodeName() ); NamedNodeMap attrs = node.getAttributes(); for ( int i = 0; i < attrs.getLength(); i++ ) { sb.append( " " ); Node attrNode = attrs.item( i ); sb.append( attrNode.getNodeName() ); sb.append( "=\"" ); sb.append( attrNode.getNodeValue() ); sb.append( "\"" ); } if ( ! node.hasChildNodes() ) { sb.append( "/>" ); } else { sb.append( ">" ); } return sb.toString(); } }