목요일, 3월 28
Shadow

#006 Flex에서 XML 을 String으로 만들때

‘XML 그냥 toString() 하던지 toXMLString() 하면 String 만들어주잖아?’ 라고 말이죠.
물론 XML의 toXMLString() 메소드를 호출하면 String 으로 만들어줍니다. 다만, 이게 개행문자(\n)가 포함되어있어서 문제가 됩니다. (개행문자 같은 metasequences는 이 곳을 참고하세요.)

  1. var sourceXML:XML = <root>  
  2.         <items>  
  3.             <item classtype=‘UIComponent’ id=‘myUIComponent’ x=’10’ y=’10’ width=’20’ height=’20’/>  
  4.             <item classtype=‘Canvas’ id=‘myCanvas’ x=’20’ y=’40’ width=’30’ height=’30’/>  
  5.             <item classtype=‘Panel’ id=‘myPanel’ x=’30’ y=’60’ width=’40’ height=’40’/>  
  6.         </items>  
  7.     </root>;  
  8.  
  9. var xmlString:String = sourceXML.toXMLString();  
  10. var targetXML:XML = new XML(xmlString);  

위와 같은 코드가 있다고 할 때에 sourceXML.toXMLString() 해서 나온 String을 담고 있는 xmlString 에는 무엇이 들어있을까요?
XML을 String으로 만들었으니 아래와 같이 있겠죠?

 <root><items><item classtype=”UIComponent” id=”myUIComponent” x=”10″ y=”10″ width=”20″ height=”20″/><item classtype=”Canvas” id=”myCanvas” x=”20″ y=”40″ width=”30″ height=”30″/><item classtype=”Panel” id=”myPanel” x=”30″ y=”60″ width=”40″ height=”40″/></items></root>


실제로 위와 같이 들어있을까요? 아닙니다.
 실제 아래와 같이 개행문자가 포함된 아래의 String이 들어있습니다.

 <root>\n  <items>\n    <item classtype=”UIComponent” id=”myUIComponent” x=”10″ y=”10″ width=”20″ height=”20″/>\n    <item classtype=”Canvas” id=”myCanvas” x=”20″ y=”40″ width=”30″ height=”30″/>\n    <item classtype=”Panel” id=”myPanel” x=”30″ y=”60″ width=”40″ height=”40″/>\n </items>\n</root>


XML을 toXMLString()으로 String으로 만들면 계층구조에 맞게 개행문자를 넣어서 String을 만들어줍니다. 그래서 해당 String을 
trace() 를 해보면 아래와 같이 콘솔에 XML의 계층구조로 보이게 됩니다. 
( toString() 을 사용해도 마찬가지 입니다.)

사용자 삽입 이미지

Flex에서 위의 xmlString 을 다시 XML 로 만들더라도 아무런 문제는 없습니다. (targetXML 에 sourceXML과 같은 XML 이 아무런 문제없이 담깁니다.) 하지만, 이렇게 변환된 String을 서버에서 사용시 문제가 생깁니다. 저는 HTTPService에서 자바 서블릿(Servlet)을 호출하여 위와 같은 XML 데이터(파라미터 이름:mydata)를 보내어서 일련의 작업을 하려고 했습니다.  아래는 해당 값을 받는 서블릿입니다.

  1. import java.io.IOException;  
  2. import java.io.StringReader;  
  3.  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.xml.parsers.DocumentBuilder;  
  9. import javax.xml.parsers.DocumentBuilderFactory;  
  10.  
  11. import org.w3c.dom.Document;  
  12. import org.xml.sax.InputSource;  
  13.  
  14. public class myServlet extends HttpServlet   
  15. {  
  16.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  17.     throws ServletException, IOException  
  18.     {  
  19.         doPost(request, response);  
  20.     }  
  21.       
  22.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
  23.         throws ServletException, IOException  
  24.     {  
  25.         String requestXML = request.getParameter(“mydata”); // XML데이터를 받음.  
  26.         Document document = convertDocument(requestXML);// Document로 변환함  
  27.  
  28.         // something….  
  29.     }  
  30.     public Document convertDocument(String requestXML)  
  31.     {  
  32.         DocumentBuilderFactory factory = null;  
  33.         DocumentBuilder builder = null;  
  34.         Document document = null;  
  35.  
  36.         try 
  37.         {  
  38.             // String을 XML 형태로 변환하자  
  39.             factory = DocumentBuilderFactory.newInstance();  
  40.             factory.setValidating(true);  
  41.  
  42.             builder = factory.newDocumentBuilder();  
  43.  
  44.             document = builder.parse(new InputSource(new StringReader(requestXML)));  
  45.         }  
  46.         catch(Exception ex)  
  47.         {  
  48.             // 에러를 출력  
  49.         }  
  50.  
  51.         return document;  
  52.     }  
  53. }  

request.getParameter(“mydata”);  라고 구현하여서 실제 Flex 에서 보낸 XML 데이터를 String에 담았습니다. 그러나 이때 이 정보를 DOM 파서를 이용하여 실제 XML로 처리하고 싶어 Document 객체를 만들어 쓰는 과정에서 문제가 생깁니다. 각 노드들의 정보를 가지고 올때 이상한 문자 들어있지 않나…;; Flex에서는 XML을 보냈으나 실제 서블릿에서 받는 데이터는 개행문자가 담겨있는 위와 같은 String 이기 때문입니다.

이러한 문제때문에 Flex에서 XML 을 String으로 만들때 개행문자를 없애는 것에 대해 고민을 했습니다.
답이 안나오더군요. -_-; 어떻게 해야되는지도 모르겠고요. 해서 toXMLString() 대신에 사용할 정적 메소드를 하나 만들었습니다.

소스 수정 – 2008. 5. 29.

  1. package   
  2. {  
  3.     public class Utils  
  4.     {  
  5.         public static function toXMLString(value:XML):String 
  6.         {  
  7.             var result:String = value.toXMLString();    //String으로 변환  
  8.             var pattern:RegExp = /\n */g;   //개행문자를 없앨 정규식  
  9.               
  10.             result = result.replace(pattern, “”);   //개행문자를 없엔다  
  11.  
  12.             return result;  
  13.         }  
  14.           
  15.     }  
  16. }  

(남남남 님께서 덧글로 남겨주신 g 플래그를 사용함)

 

수정 전 소스 닫기

  1. package   
  2. {  
  3.     public class Utils  
  4.     {  
  5.         public static function toXMLString(value:XML):String 
  6.         {  
  7.             var result:String = value.toXMLString();    //String으로 변환  
  8.             var counter:int = result.split(“\n”).length;    //개행문자의 갯수를 알아온다  
  9.             var pattern:RegExp = /> *\n *</;      //개행문자를 없앨 정규식  
  10.               
  11.             for(var i:int=0; i<counter; i++)  
  12.             {  
  13.                 result = result.replace(pattern, “><“);   //개행문자를 없엔다  
  14.                 // replaceAll 이 없는 관계로다가…;;  
  15.             }  
  16.               
  17.             return result;  
  18.         }  
  19.           
  20.     }  
  21. }  

수정 전 소스 닫기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.