노무현 대통령 배너

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 parser 에 의해 액면가 그대로 액션스크립트에 전달됩니다. 즉, 왼쪽과 같은 현상이죠.
이 문제를 해결하기 위해서 xml 을 작성할때 개행을 위해서 엔터를 입력할때 자동으로 탭 문자를 들여쓰지 않기 위해 아래쪽 에디트플러스의 화면과 같이 개행한 이후 다음 라인의 첫 열로 입력 커서를 위치시키는 번거로운 작업을 하는 경우도 있습니다.
탭 문자가 전혀 필요하지 않다고 단정지을 수는 없지만, 일반적으로 xml을 작성할때 생기는 자동 들여쓰기의 탭은 액션스크립트의 TextField 에서는 사용할 일이 없을뿐더러, 우리가 의도하지 않은 엉뚱한 결과를 내기 때문에 탭 문자인 “\t” 을 공백이 없는 “” 로 변경합니다.
Edit plus 에서의 화면, 왼쪽과 같이 입력되지만 탭 문자 때문에 오른쪽 같이 수정해야하는 경우가 있습니다.

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() );
// 출력 : 시계태엽 & 어린쥐
  OptimizeXMLString class - replaceString.as 파일 포함

이렇게 해서 String 클래스의 replace() 가 API 차원에서 학습 된 후, 재사용이 가능한 *.as 파일 로 만들어지고 (또는 클래스 파일로 만들어지고), 그것이 다시 확장되어 다른 클래스에서 활용되는 과정( 이 포스트 ) 을 모두 살펴보았습니다.

이 글을 복사해서 퍼가시는건 허용하지 않습니다. 글의 주소를 다른곳에 알려주시는 것은 환영합니다.
  1. xml 뿐만 아니라 html, php, jsp 등 서버사이드쪽에서 사용되는 텍스트 문서 전체에 해당되기도 하죠. []
  2. OptimizeXMLString 클래스 상단에 kr.ufx.text.replaceString 파일이 import 된 것을 확인할 수 있습니다. []

관련된 글

:, , , , , , , , , , ,

4 Comments for this entry

Leave a Reply

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Meta