2008. 5. 28. 15:35
[Dev/Flex]
제목이 좀 뜬금없다... 라고 생각하시는 분이 있으실 것 같습니다. ;)
'XML 그냥 toString() 하던지 toXMLString() 하면 String 만들어주잖아?' 라고 말이죠.
물론 XML의 toXMLString() 메소드를 호출하면 String 으로 만들어줍니다. 다만, 이게 개행문자(\n)가 포함되어있어서 문제가 됩니다. (개행문자 같은 metasequences는 이 곳을 참고하세요.)
위와 같은 코드가 있다고 할 때에 sourceXML.toXMLString() 해서 나온 String을 담고 있는 xmlString 에는 무엇이 들어있을까요?
XML을 String으로 만들었으니 아래와 같이 있겠죠?
실제로 위와 같이 들어있을까요? 아닙니다. 실제 아래와 같이 개행문자가 포함된 아래의 String이 들어있습니다.
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() 대신에 사용할 정적 메소드를 하나 만들었습니다.
위의 Utils.toXMLString()을 이용하여 다시 XML을 String으로 변환해보면 (var xmlString:String = Utils.toXMLString(sourceXML);) 맨 처음 예를 들었던 것과 같이 개행문자와 빈칸이 없는 String을 보실 수 있습니다. (노드사이에 빈칸이 있으면 그 것도 문제가 되더라구요)
코드가 좀 추합니다. ^^; 서버에서 제가 잘못처리해서 문제가 되었을지도 모르겠습니다.
더 좋은 방법을 아시는 분께서는 피드백 주시면 정말 감사하겠습니다. :)
2008. 6. 3. 추가
이정웅님께서 XML을 toString() 이나 toXMLString() 하면 개행문자가 포함되는 것에 대한 이유를 알려주셨습니다.
다름아닌 XML 클래스의 prettyPrinting 속성이 있었네요. 기본값이 true 인데, false 로 바꾸면 한줄로 주르륵 나옵니다. ㅜㅜ
(이쁘게 프린팅한다라... ㅜㅜ)
'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() 대신에 사용할 정적 메소드를 하나 만들었습니다.
수정 전 소스 열기
위의 Utils.toXMLString()을 이용하여 다시 XML을 String으로 변환해보면 (var xmlString:String = Utils.toXMLString(sourceXML);) 맨 처음 예를 들었던 것과 같이 개행문자와 빈칸이 없는 String을 보실 수 있습니다. (노드사이에 빈칸이 있으면 그 것도 문제가 되더라구요)
코드가 좀 추합니다. ^^; 서버에서 제가 잘못처리해서 문제가 되었을지도 모르겠습니다.
더 좋은 방법을 아시는 분께서는 피드백 주시면 정말 감사하겠습니다. :)
2008. 6. 3. 추가
이정웅님께서 XML을 toString() 이나 toXMLString() 하면 개행문자가 포함되는 것에 대한 이유를 알려주셨습니다.
다름아닌 XML 클래스의 prettyPrinting 속성이 있었네요. 기본값이 true 인데, false 로 바꾸면 한줄로 주르륵 나옵니다. ㅜㅜ
(이쁘게 프린팅한다라... ㅜㅜ)
'Dev > Flex' 카테고리의 다른 글
[Flex] mx_internal 로 선언된 변수나 메소드에 접근하기 (namespace 의 사용) (17) | 2008.06.21 |
---|---|
[Flex] 더블클릭(doubleClick)을 사용해보자. (6) | 2008.06.03 |
[Flex] Mask 를 이용한 둥근 컴포넌트 만들기 (19) | 2008.05.13 |
[Flex] DataGrid 의 아이템을 클릭할때는 itemClick 이벤트를 사용하자. (Tip) (12) | 2008.04.22 |
[Flex] 수동으로 이벤트 발생시키기 - dispatchEvent() (7) | 2008.03.17 |