xml 작업에 최적화된 문자열 바꾸기 String replace 클래스
by 세계의끝 on 11.29, 2009, under AS3.0 API
xml을 이용해서 작업을 하다 보면 플래시의 TextField 특성에 기인해서 replace() 를 고정적으로 해 줘야 할 것이 몇 가지 있습니다.
1. 첫 번째로는 개행문자 입니다.

왼쪽과 같이 나오길 기대하지만 개행 문제 때문에 오른쪽과 같이 되버립니다.
보통 xml의 개행문자는 “\r\n” 이지만,[01] 액션스크립트의 개행문자는 “\n” 입니다. 액션스크립트에서 “\r\n” 을 TextField 에 적용하면 위의 이미지와 같이 2줄이 개행이 되버리는 문제를 교정하기 위해서 “\r\n” 를 “\n” 로 replace() 해 줘야 합니다.
2. 두 번째로는 탭 문자 입니다.

이런 화면, 종종 만나보셨을 겁니다.
이 문제를 해결하기 위해서 xml 을 작성할때 개행을 위해서 엔터를 입력할때 자동으로 탭 문자를 들여쓰지 않기 위해 아래쪽 에디트플러스의 화면과 같이 개행한 이후 다음 라인의 첫 열로 입력 커서를 위치시키는 번거로운 작업을 하는 경우도 있습니다.
탭 문자가 전혀 필요하지 않다고 단정지을 수는 없지만, 일반적으로 xml을 작성할때 생기는 자동 들여쓰기의 탭은 액션스크립트의 TextField 에서는 사용할 일이 없을뿐더러, 우리가 의도하지 않은 엉뚱한 결과를 내기 때문에 탭 문자인 “\t” 을 공백이 없는 “” 로 변경합니다.

Edit plus 에서의 화면, 왼쪽과 같이 입력되지만 탭 문자 때문에 오른쪽 같이 수정해야하는 경우가 있습니다.
3. 세 번째로는 & (앰퍼샌드) 문자입니다.
xml 은 모든 특수문자가 입력 가능하지만, &만큼은 예외로 xml 노드명, 노드값, 속성명, 속성값 어디에 있건 파싱 에러를 내게 됩니다. 액션스크립트가 에러를 내기 이전에 xml 파일을 브라우저로 열어보는것 만으로도 &는 xml 에 사용될 수 없음을 잘 알 수 있습니다.
그렇다고 &를 안쓸 수 있느냐 하면 그럴수도 없습니다. 네비게이션 바 만들때 Q&A 같은 문자열은 매번 문제가 되죠. &를 입력할 일이 있을 때 and 로 바꿔서 입력하려는 노력도, Q&A 앞에서는 한동안 멍때리게 됩니다.
그래서 &의 코드 값인 “%26″으로 입력하고 액션스크립트에서 “&”로 바꿔 줍니다. Q&A 는 Q%26A 로 입력하면 되겠죠.
이렇게 xml 단골 replace 를 모아서 한번에 처리할 수 있는 클래스를 만들었으니 이름하여 OptimizeXMLString 입니다.
0 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | package kr.ufx.utils { import kr.ufx.text.replaceString; /** * ... * @author 원종선(세계의끝) http://ufx.kr/blog */ public class OptimizeXMLString { // 찾을 문자열 private var _arrStringList:Array = [ "\r\n", "\t", "%26" ]; // 바꿔낼 문자열 private var _arrReplacedList:Array = [ "\n", "", "&" ]; private var _text:String; public function OptimizeXMLString( $text:String = null ) { this._text = $text; } public function addReplace( $string:String, $replaced:String ):void { _arrStringList.push( $string ); _arrReplacedList.push( $replaced ); } public function optimizing( $text:String = null ):String { var str:String = getText( $text ); var len:uint = _arrStringList.length; for ( var i:uint = 0; i < len; ++i ) { str = replaceString( str, _arrStringList[ i ], _arrReplacedList[ i ] ) } return str; } private function getText( $text:String ):String { var str:String; if ( $text ) str = _text = $text; else if ( _text ) str = _text; else str = ""; return str; } public function get stringList():Array { return _arrStringList; } public function get replacedList():Array { return _arrReplacedList; } public function get text():String { return _text; } public function set text( $value:String ):void { _text = $value; } } } |
이렇게 기본적으로 위에서 열거한 세 가지의 단골 문자열을 배열로 기본 입력해 놓고, replace 가 필요한 문자열이 더 있다면 추가해서 사용하는 방식으로 클래스를 구성하였습니다.
실제로 이 클래스는 replace 를 할 문자열을 추가, 관리, 조회 하는 내용만 존재하고, 실제로 문자열을 바꿔주는 기능은 이전 포스트에서 소개해 드린 replaceString 파일에서 수행합니다.[02]
OptimizeXMLString 를 이용해서 여러가지 형태로 사용하는 방법을 아래의 호스트코드에서 보시죠.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import kr.ufx.utils.OptimizeXMLString; var str:String = "세계의끝 %26 플래시 %26 원더랜드"; trace( str ); // 출력 : 세계의끝 %26 플래시 %26 원더랜드 // 생성자에서 변환할 text 대입 var optimizer:OptimizeXMLString = new OptimizeXMLString( str ); trace( optimizer.optimizing() ); // 출력 : 세계의끝 & 플래시 & 원더랜드 // optimizing 메서드에 직접 text 를 대입하여 변경 trace( optimizer.optimizing( "2001 %26 스페이스 %26 오딧세이" ) ); // 출력 : 2001 & 스페이스 & 오딧세이 // getter 메서드를 이용해 text 대입 ( text 내용 변경 ) optimizer.text = "시계태엽 %26 오렌지"; trace( optimizer.optimizing() ); // 출력 : 시계태엽 & 오렌지 // 변환할 단어를 추가 optimizer.addReplace( "오렌지", "어린쥐" ); trace( optimizer.optimizing() ); // 출력 : 시계태엽 & 어린쥐 |
이렇게 해서 String 클래스의 replace() 가 API 차원에서 학습 된 후, 재사용이 가능한 *.as 파일 로 만들어지고 (또는 클래스 파일로 만들어지고), 그것이 다시 확장되어 다른 클래스에서 활용되는 과정( 이 포스트 ) 을 모두 살펴보았습니다.
- xml 뿐만 아니라 html, php, jsp 등 서버사이드쪽에서 사용되는 텍스트 문서 전체에 해당되기도 하죠. [↑]
- OptimizeXMLString 클래스 상단에 kr.ufx.text.replaceString 파일이 import 된 것을 확인할 수 있습니다. [↑]
Blog under the Creative Commons Attribution-NoDerivs 3.0 License
11월 30th, 2009 on am 2:55
세 가지 문제 모두, XML Specification 및 Recommendation을 따르지 않아 발생하는 문제네요.
11월 30th, 2009 on pm 4:00
아무래도 &는
&로 쓰는 것이 더 좋겠군요.
3월 4th, 2011 on am 11:55
텍스트에이터에서 매번 들여쓰기 된 부분 밀어넣고 노가다(?) 작업 많이 했었는데…
이런 방법이 있었군요. 말 그대로 optimize입니다
3월 4th, 2011 on pm 12:51
네. 이런 클래스는 귀차니즘 때문에 탄생하게 되죠 ㅎㅎ