2008.05.28 15:35
제목이 좀 뜬금없다... 라고 생각하시는 분이 있으실 것 같습니다. ;)

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



위와 같은 코드가 있다고 할 때에 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)를 보내어서 일련의 작업을 하려고 했습니다.  아래는 해당 값을 받는 서블릿입니다.



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

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

소스 수정 - 2008. 5. 29.

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

수정 전 소스 열기



위의 Utils.toXMLString()을 이용하여 다시 XML을 String으로 변환해보면 (var xmlString:String = Utils.toXMLString(sourceXML);) 맨 처음 예를 들었던 것과 같이 개행문자와 빈칸이 없는 String을 보실 수 있습니다. (노드사이에 빈칸이 있으면 그 것도 문제가 되더라구요)

코드가 좀 추합니다. ^^; 서버에서 제가 잘못처리해서 문제가 되었을지도 모르겠습니다.
더 좋은 방법을 아시는 분께서는 피드백 주시면 정말 감사하겠습니다. :)

2008. 6. 3. 추가

이정웅님께서 XML을 toString() 이나 toXMLString() 하면 개행문자가 포함되는 것에 대한 이유를 알려주셨습니다.
다름아닌 XML 클래스의 prettyPrinting 속성이 있었네요. 기본값이 true 인데, false 로 바꾸면 한줄로 주르륵 나옵니다. ㅜㅜ
(이쁘게 프린팅한다라... ㅜㅜ)
신고
Favicon of http://kieat.tistory.com BlogIcon 남남남 | 2008.05.29 15:22 신고 | PERMALINK | EDIT/DEL | REPLY
var ta:String = '&lt;root&gt;\n &lt;items&gt;\n &lt;item classtype="UIComponent" id="myUIComponent" x="10" y="10" width="20" height="20"/&gt;\n &lt;item classtype="Canvas" id="myCanvas" x="20" y="40" width="30" height="30"/&gt;\n &lt;item classtype="Panel" id="myPanel" x="30" y="60" width="40" height="40"/&gt;\n &lt;/items&gt;\n&lt;/root&gt;';

var pattern:RegExp = /\n */g;

ta = ta.replace(pattern,"");
trace(ta);

저는 이렇게 했습니다. 중요한건 정규식 마지막에 g flag(global)를 추가하면 split와 for문구를 사용하지 않아도 된다는것.
이상입니다.^^
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.29 16:02 신고 | PERMALINK | EDIT/DEL
와우~ 정말 감사합니다 ;)
g 플래그라는 것이 있었군요. 역시 무식하면 손발이 고생한다니까요 ㅎㅎ 전 컴퓨터까지 고생시키고 있었군요.
정규표현식에 대해서 더 공부를 해봐야겠습니다. 다시 한번 감사드립니다. ;)
Favicon of http://bluemetal.tistory.com BlogIcon 이정웅 | 2008.06.03 12:16 신고 | PERMALINK | EDIT/DEL | REPLY
이거 XML클래스의 prettyPrinting이란 플래그를 이용하면 해결되는거같네요
디폴트값이 true여서 그런데 false로 주면 한줄로 쭉 나오는거같아요 개행문자같은거 삭제되구요

var xml:XML = &lt;foo&gt;&lt;bar/&gt;&lt;/foo&gt;;
XML.prettyPrinting = false;
trace(xml.toXMLString());

XML.prettyPrinting = true;
trace(xml.toXMLString());
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.03 13:01 신고 | PERMALINK | EDIT/DEL
아하하하;;;
이럴 줄 알았습니다. ㅋ 뭔가 설정이 있을텐데 하면서 못찾아서... ㅜㅜ

감사합니다 ;)
역시 고수는 다르시군요!
Favicon of http://lovedev.tistory.com BlogIcon lovedev | 2008.06.04 11:00 신고 | PERMALINK | EDIT/DEL | REPLY
ㅋㅋㅋ 정웅님 여기도 계시넹 ^^
검쉰님 고생하셨습니다 :)
팀 잘보고 가요~
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.04 12:57 신고 | PERMALINK | EDIT/DEL
ㅜㅜ
완전 무식해서 손이 고생하는 중입니다. ;;
박스농사 | 2008.06.24 13:23 신고 | PERMALINK | EDIT/DEL | REPLY
에휴..
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.24 15:28 신고 | PERMALINK | EDIT/DEL
에휴...
님하... | 2008.11.28 14:42 신고 | PERMALINK | EDIT/DEL | REPLY
밤춈 사주세염....

님하...술춈........

안그럼 쟈기야 라고 부른다...ㅋㄷㅋㄷ
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2008.12.02 01:18 신고 | PERMALINK | EDIT/DEL
ㅈㅓㄹㅣㄱㅏ
Favicon of http://davidwin.tistory.com BlogIcon 만두팀 | 2009.11.19 17:07 신고 | PERMALINK | EDIT/DEL | REPLY
value.replace(exp,"");
이렇게만 하면 안되네요 ㅜㅜ

value = value.replace(exp,""); 라고 해야하네요
좋은 정보 감사합니다~~~~
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.11.19 19:35 신고 | PERMALINK | EDIT/DEL
replace 는 문자열을 바꿔주는게 아니라 해당 문자열을 원하는대로 변경하여 새로운 문자열을 리턴해주니까요 ;)
경험해서 배운건 잊어버리지 않으니 좋은 경험 하신듯 ^^
| 2010.06.17 14:32 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2010.06.18 18:02 신고 | PERMALINK | EDIT/DEL
1. 서블릿부터 정상동작하는지 확인 바랍니다.

2. navigateToURL 은 새로운 창을 띄우는 동작을 합니다. Flex에서는 HTTPService 를 이용하셔서 서블릿을 호출하셔야 합니다. 그렇게 하셔야 서블릿 호출이 안되는 것인지, 호출하였으나 결과가 안오는 것인지 등의 에러발생에 대해 알 수 있습니다.

질문은 메일로 부탁드리고, 덧글 남기실때에는 본인 이메일같은 정보 정도는 남겨주셨으면 좋겠네요.
좋은 하루되세요~ ;)
Favicon of http://webnoon.net BlogIcon 웹눈 | 2010.06.22 09:02 신고 | PERMALINK | EDIT/DEL | REPLY
오.. 좋은거 배워갑니다 ^^
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret

티스토리 툴바