0,0 → 1,129 |
package ak.zpath; |
|
import org.w3c.dom.*; |
import java.io.*; |
|
public class XmlSaver |
{ |
public static final String ENCODING = "UTF-8"; |
public static final String INDENT = "\t"; |
|
private OutputStream output; |
private PrintStream printer; |
|
public XmlSaver() |
{ |
} |
|
public XmlSaver(OutputStream output) |
{ |
setOutput(output); |
} |
|
public OutputStream getOutput() |
{ |
return output; |
} |
|
public void setOutput(OutputStream output) |
{ |
this.output = output; |
} |
|
public void save(Document document) |
throws IOException |
{ |
printer = new PrintStream(output, false, ENCODING); |
printer.println( |
"<?xml version=\"1.0\" encoding=\"" + ENCODING + "\"?>\n"); |
|
if(document != null) |
saveElement(document.getDocumentElement(), ""); |
|
printer.flush(); |
} |
|
protected void saveElement(Element element, String indent) |
throws IOException |
{ |
if(element == null) return; |
|
String newIndent = indent + INDENT; |
NodeList children = element.getChildNodes(); |
NamedNodeMap attrs = element.getAttributes(); |
boolean isEmpty = true; |
boolean hasText = false; |
|
// print tag name |
printer.print(indent); |
printer.print("<"); |
printer.print(element.getTagName()); |
|
// print attributes |
for(int i = 0; i < attrs.getLength(); i++) { |
Attr attr = (Attr)attrs.item(i); |
printer.print(" "); |
printer.print(attr.getName()); |
printer.print("=\""); |
printer.print(attr.getValue()); |
printer.print("\""); |
} |
|
// chech if has nested elements |
for(int i = 0; i < children.getLength(); i++) { |
Node subnode = children.item(i); |
|
if(subnode instanceof Comment) |
isEmpty = false; |
else if(subnode instanceof Element) |
isEmpty = false; |
else if(subnode instanceof Text) |
hasText = true; |
} |
|
if(isEmpty) { // empty element |
if(!hasText) { |
printer.println("/>"); |
} |
else { |
printer.print(">"); |
|
// print nested text |
for(int i = 0; i < children.getLength(); i++) { |
Node subnode = children.item(i); |
if(subnode instanceof Text) |
printer.print(subnode.getNodeValue()); |
} |
|
printer.print("</"); |
printer.print(element.getTagName()); |
printer.println(">"); |
} |
} |
else { // has nested elements |
printer.println(">"); |
|
// print nested elements, comment, text |
for(int i = 0; i < children.getLength(); i++) { |
Node subnode = children.item(i); |
|
if(subnode instanceof Comment) { |
printer.print("<!--"); |
printer.print(subnode.getNodeValue()); |
printer.println("-->"); |
} |
else if(subnode instanceof Element) { |
saveElement((Element)subnode, newIndent); |
} |
else if(subnode instanceof Text) { |
printer.print(subnode.getNodeValue()); |
} |
} |
|
printer.print(indent); |
printer.print("</"); |
printer.print(element.getTagName()); |
printer.println(">"); |
} |
} |
} |