Subversion Repositories general

Compare Revisions

Ignore whitespace Rev 1004 → Rev 1005

/zpath/trunk/src/ak/zpath/XmlSaver.java
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(">");
}
}
}