DOM 형태의 XML을 파라미터로 받아 String을 린턴해 주는 소스이다.
"자바와 XML - 한빛미디어"의 소스를 이용한 유틸리티성 클래스이다.
현재 현업에서 문제없이 사용하고 있는 소스이다.
/**
*
*/
package com.mediachorus.pepbox.util.xml;
import java.io.IOException;
import org.apache.log4j.Logger;
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;
/**
* @author SangHyup LEE
* @version 1.0
*
*/
public class XMLSerializer {
protected final Logger logger = Logger.getLogger(getClass());
private String xmlString = "";
public XMLSerializer() {
}
public String documentWriter(Document sourceDoc) {
// String result = "";
try {
serializeNode(sourceDoc, "", 0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return xmlString;
}
private void serializeNode(Node node, String indentLevel, int account) throws IOException {
String lineSeparator = "\n";
String indent = "";
// logger.debug("xmlString [" + account + "] : " + xmlString);
switch ( node.getNodeType() ) {
case Node.DOCUMENT_NODE :
// SMIL에서는 필요없다.
// writer.write("<?xml version=\"1.0\"?>");
// writer.write(lineSeparator);
// 각각의 자식 노드를 재귀적으로 처리한다.
NodeList nodes = node.getChildNodes();
if ( nodes != null ) {
for ( int i=0; i < nodes.getLength(); i++ ) {
account++;
serializeNode(nodes.item(i), "", account);
}
}
break;
case Node.ELEMENT_NODE :
// logger.debug("ELEMENT_NODE");
String name = node.getNodeName();
xmlString += indentLevel + "<" + name;
// logger.debug("ELEMENT_NODE result : " + result);
// writer.write(indentLevel + "<" + name);
// Attributes process
NamedNodeMap attributes = node.getAttributes();
for ( int i=0; i < attributes.getLength(); i++ ) {
Node current = attributes.item(i);
xmlString += " " + current.getNodeName() +
"=\"" + current.getNodeValue() +
"\"";
// logger.debug("ELEMENT_NODE for xmlString : " + xmlString);
/*
writer.write(" " + current.getNodeName() +
"=\"" + current.getNodeValue() +
"\"");
*/
}
xmlString += ">";
// writer.write(">");
// 각각의 자식 노드를 재귀적으로 처리한다.
NodeList children = node.getChildNodes();
if ( children != null ) {
if ( (children.item(0) != null) &&
(children.item(0).getNodeType() == Node.ELEMENT_NODE) ) {
xmlString += lineSeparator;
// writer.write(lineSeparator);
}
for ( int i=0; i < children.getLength(); i++ ) {
account++;
serializeNode(children.item(i), indentLevel + indent, account);
}
if ( (children.item(0) != null) &&
(children.item(children.getLength() - 1).getNodeType() == Node.ELEMENT_NODE) ) {
xmlString += indentLevel;
// writer.write(indentLevel);
}
}
xmlString += "</" + name + ">";
xmlString += lineSeparator;
// logger.debug("ELEMENT_NODE xmlString : " + xmlString);
/*
writer.write("</" + name + ">");
writer.write(lineSeparator);
*/
break;
case Node.TEXT_NODE :
xmlString += node.getNodeValue();
// writer.write(node.getNodeValue());
account++;
break;
case Node.CDATA_SECTION_NODE :
xmlString += "<![CDATA[" + node.getNodeValue() + "]]>";
// writer.write("<![CDATA[" + node.getNodeValue() + "]]>");
account++;
break;
case Node.COMMENT_NODE :
xmlString += indentLevel + "<!-- " + node.getNodeValue() + " -->";
xmlString += lineSeparator;
/*
writer.write(indentLevel + "<!-- " + node.getNodeValue() + " -->");
writer.write(lineSeparator);
*/
account++;
break;
case Node.PROCESSING_INSTRUCTION_NODE :
xmlString += "<?" + node.getNodeName() + " " + node.getNodeValue() + "?>";
xmlString += lineSeparator;
/*
writer.write("<?" + node.getNodeName() + " " + node.getNodeValue() + "?>");
writer.write(lineSeparator);
*/
account++;
break;
case Node.ENTITY_REFERENCE_NODE :
xmlString += "&" + node.getNodeName() + ";";
// writer.write("&" + node.getNodeName() + ";");
account++;
break;
case Node.DOCUMENT_TYPE_NODE :
DocumentType docType = (DocumentType)node;
xmlString += "<!DOCTYPE " + docType.getName();
// writer.write("<!DOCTYPE " + docType.getName());
if ( docType.getPublicId() != null ) {
System.out.print(" PUBLIC \"" + docType.getPublicId() + "\"");
} else {
xmlString += " SYSTEM ";
// writer.write(" SYSTEM ");
}
xmlString += "\"" + docType.getSystemId() + "\">";
xmlString += lineSeparator;
/*
writer.write("\"" + docType.getSystemId() + "\">");
writer.write(lineSeparator);
*/
account++;
break;
}
}
}
댓글 없음:
댓글 쓰기