2009년 4월 30일 목요일

DOM API를 이용한 XML 데이터를 String으로 리턴해 주는 소스

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;
        }
    }
    
}

댓글 없음: