XML
posted by 준치 2008. 8. 25. 16:34
XML에서는 아래 5가지의 특수문자를 사전정의하고 있다.
Name Character Code
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;
 }
}