레이블이 DOM인 게시물을 표시합니다. 모든 게시물 표시
레이블이 DOM인 게시물을 표시합니다. 모든 게시물 표시

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