달력

02

« 2012/02 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  •  
  •  
  •  
XML에서는 아래 5가지의 특수문자를 사전정의하고 있다.

NameCharacterCode
quot""
amp&&
apos''
lt<&lt;
gt>&gt;

만약, 별도의 XML API를 사용하지 않는다면 해당 캐릭터가 String으로 XML의 value 또는 context text로 포함되어 있을 경우 XML 파서에서는 에러를 리턴하게 된다. 따라서 XML Write할 때 위의 특수문자를 Code로 바꾸어 주어야 한다.

다음은 Java를 이용하여 해당 문자를 Code로 바꾸어주는 TDD 소스이다.

/**
 * XML에서 사용할 수 없는 특수문자를 변경해 준다.
 */
package com.mediachorus.pepbox.encoding;
import java.nio.CharBuffer;
import junit.framework.TestCase;
/**
 * @author SangHyup LEE
 * @version 1.0
 *
 */
public class ToXMLStringTest extends TestCase {
 public void testToXMLString() {
  String name = "\"한&글'을<포>함";
  
  CharBuffer cb = CharBuffer.wrap(name);
  String xmlString = "";
  while ( cb.hasRemaining() ) {
   // System.out.println(cb.get() + " ");
   char tempChar = cb.get();
   
   if ( tempChar == '"' ) {
    xmlString += "&quot;";
   } else if ( tempChar == '&' ) {
    xmlString += "&amp;";
   } else if ( tempChar == '\'' ) {
    xmlString += "&apos;";
   } else if ( tempChar == '<' ) {
    xmlString += "&lt;";
   } else if ( tempChar == '>' ) {
    xmlString += "&gt;";
   } else {
    xmlString += tempChar;
   }
  }
  // System.out.println("xmlString : " + xmlString);
  
  assertEquals("&quot;한&amp;글&apos;을&lt;포&gt;함", xmlString);
 }
}



위의 testToXMLString() 메소드의 구현 부분을 static 메소드를 사용하여 구현해 주면 된다. 예를 들면 다음과 같다.

public class ConvertUtil {
 public static String toXMLString(String input) {
  String xmlString = "";
  
  CharBuffer cb = CharBuffer.wrap(input);
  while ( cb.hasRemaining() ) {
   char tempChar = cb.get();
   
   if ( tempChar == '"' ) {
    xmlString += "&quot;";
   } else if ( tempChar == '&' ) {
    xmlString += "&amp;";
   } else if ( tempChar == '\'' ) {
    xmlString += "&apos;";
   } else if ( tempChar == '<' ) {
    xmlString += "&lt;";
   } else if ( tempChar == '>' ) {
    xmlString += "&gt;";
   } else {
    xmlString += tempChar;
   }
  }
  
  return xmlString;
 }
}
Posted by korcslewis
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;
        }
    }
    
}
TAG dom, java, XML
Posted by korcslewis