159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.export.xml; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.*; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.charset.Charset; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport org.w3c.dom.*; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The DOMSerializer was based primarily off the DOMSerializer.java class from the 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "Java and XML" 3rd Edition book by Brett McLaughlin, and Justin Edelson. Some 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modifications were made to support formatting of elements and attributes. 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Brett McLaughlin, Justin Edelson - Original creation for "Java and XML" book. 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Doug Daniels (dougnukem) - adjustments for XML formatting 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @version $Revision: 4207 $, $Date: 2009-03-29 11:19:16 -0400 (Sun, 29 Mar 2009) $ 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class DOMSerializer { 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The encoding to use for output (default is UTF-8) */ 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Charset encoding = Charset.forName("utf-8"); 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The amount of indentation to use (default is 4 spaces). */ 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int indent = 4; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The line separator to use (default is the based on the current system settings). */ 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private String lineSeparator = System.getProperty("line.separator", "\n"); 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void escape(Writer writer, String s) throws IOException { 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (s == null) { return; } 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0, len = s.length(); i < len; i++) { 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta char c = s.charAt(i); 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (c) { 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case '<': 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write("<"); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case '>': 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write(">"); 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case '&': 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write("&"); 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case '\r': 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write("
"); 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write(c); 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Serialize {@code doc} to {@code out} 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param doc the document to serialize. 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param file the file to serialize to. 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws IOException 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void serialize(Document doc, File file) throws IOException { 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta serialize(doc, new FileOutputStream(file)); 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Serialize {@code doc} to {@code out} 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param doc the document to serialize. 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param out the stream to serialize to. 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws IOException 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void serialize(Document doc, OutputStream out) throws IOException { 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Writer writer = new OutputStreamWriter(out, encoding); 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta write(doc, writer, 0); 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.flush(); 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Set the encoding used by this serializer. 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param encoding the encoding to use, passing in {@code null} results in the 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * default encoding (UTF-8) being set. 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws IllegalCharsetNameException if the given charset name is illegal. 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws UnsupportedCharsetException if the given charset is not supported by the 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * current JVM. 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setEncoding(String encoding) { 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.encoding = Charset.forName(encoding); 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Set the number of spaces to use for indentation. 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <p> 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The default is to use 4 spaces. 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param indent the number of spaces to use for indentation, values less than or 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * equal to zero result in no indentation being used. 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setIndent(int indent) { 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.indent = indent >= 0 ? indent : 0; 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Set the line separator that will be used when serializing documents. 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <p> 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * If this is not called then the serializer uses a default based on the 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * {@code line.separator} system property. 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param lineSeparator the line separator to set. 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setLineSeparator(String lineSeparator) { 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.lineSeparator = lineSeparator; 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void write(Node node, Writer writer, int depth) throws IOException { 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (node.getNodeType()) { 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.DOCUMENT_NODE: 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writeDocument((Document) node, writer); 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.ELEMENT_NODE: 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writeElement((Element) node, writer, depth); 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.TEXT_NODE: 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta escape(writer, node.getNodeValue()); 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.CDATA_SECTION_NODE: 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write("<![CDATA["); 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta escape(writer, node.getNodeValue()); 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write("]]>"); 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.COMMENT_NODE: 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < depth; ++i) { writer.append(' '); } 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("<!-- ").append(node.getNodeValue()).append(" -->").append(lineSeparator); 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.PROCESSING_INSTRUCTION_NODE: 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String n = node.getNodeName(); 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String v = node.getNodeValue(); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < depth; ++i) { writer.append(' '); } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("<?").append(n).append(' ').append(v).append("?>").append(lineSeparator); 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.ENTITY_REFERENCE_NODE: 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append('&').append(node.getNodeName()).append(';'); 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Node.DOCUMENT_TYPE_NODE: 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writeDocumentType((DocumentType) node, writer, depth); 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta break; 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void writeDocument(Document document, Writer writer) throws IOException { 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String v = document.getXmlVersion(); 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("<?xml "); 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append(" version='").append(v == null ? "1.0" : v).append("'"); 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append(" encoding='").append(encoding.name()).append("'"); 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (document.getXmlStandalone()) { 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append(" standalone='yes'"); 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("?>").append(lineSeparator); 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta NodeList nodes = document.getChildNodes(); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0, imax = nodes.getLength(); i < imax; ++i) { 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta write(nodes.item(i), writer, 0); 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void writeDocumentType(DocumentType docType, Writer writer, int depth) throws IOException { 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String publicId = docType.getPublicId(); 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String internalSubset = docType.getInternalSubset(); 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < depth; ++i) { writer.append(' '); } 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("<!DOCTYPE ").append(docType.getName()); 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (publicId != null) { 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append(" PUBLIC '").append(publicId).append("' "); 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.write(" SYSTEM "); 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("'").append(docType.getSystemId()).append("'"); 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (internalSubset != null) { 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append(" [").append(internalSubset).append("]"); 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append('>').append(lineSeparator); 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void writeElement(Element element, Writer writer, int depth) throws IOException { 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < depth; ++i) { writer.append(' '); } 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append('<').append(element.getTagName()); 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta NamedNodeMap attrs = element.getAttributes(); 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0, imax = attrs.getLength(); i < imax; ++i) { 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Attr attr = (Attr) attrs.item(i); 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append(' ').append(attr.getName()).append("='").append(attr.getValue()).append("'"); 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta NodeList nodes = element.getChildNodes(); 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (nodes.getLength() == 0) { 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // no children, so just close off the element and return 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("/>").append(lineSeparator); 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append('>').append(lineSeparator); 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0, imax = nodes.getLength(); i < imax; ++i) { 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Node n = nodes.item(i); 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (n.getNodeType() == Node.ATTRIBUTE_NODE) { continue; } 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta write(n, writer, depth + indent); 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < depth; ++i) { writer.append(' '); } 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta writer.append("</").append(element.getTagName()).append('>').append(lineSeparator); 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 238