XMLLoader, a custom class.

I devised the XMLLoader class to avoid the URLLoader bug that I posted on FlaLab.com.
Related links
예전에 FlaLab에 올렸던 URLLoader의 버그를 회피하기 위해서 만든 XMLLoader 클래스 입니다.
참고 링크
私がFlaLab.comに書いたURLLoaderのバーグを回避するためにXMLLoaderクラスを作りました。
参考リンク

http://www.flalab.com/phpBB2/viewtopic.php?t=1791
http://www.flalab.com/phpBB2/viewtopic.php?t=2228

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/**
 * XMLLoader
 *
 * XMLLoader class loads and validates an XML file.
 * If you loads a text file encoded in the euc-kr encoding via an URLLoader, frequently, the source data is currupted.
 * To avoid this problem, parses the loaded data into an XMLDocument,
 * then, parses the first node of the XMLDocument into an XML.
 * If an error has been occured, reloads the XML data.
 * 
 *
 * @author: Han Sanghun (http://hangunsworld.com, hanguns@gmail.com)
 * @created: 2008 02 28
 * @last modified: 2008 02 29
 */
 
 
package com.hangunsworld.as3.net{
 
	import	flash.events.*;
	import	flash.net.*;
	import	flash.utils.Timer;
	import	flash.xml.*;
 
 
	public class XMLLoader{
 
 
		private var path:String;
		private var returnFunction:Function;
		private var errorFunction:Function;
 
		private var timer:Timer;
		private var xml:XML;
 
		private var xml_ul:URLLoader;
		private var xml_ur:URLRequest;
		private var xml_uv:URLVariables;
 
		/**
		 * XMLLoader constructor
		 *
		 * @param pPath A path of an XML file
		 * @param okFunc A function to call when the XML is loaded successfully
		 * @param errorFunc A function to call when an IOError has occured
		 */
		public function XMLLoader(pPath:String, okFunc:Function=null, errorFunc:Function=null){
 
			path = pPath;
			returnFunction = okFunc;
			errorFunction = errorFunc
 
			XML.ignoreWhitespace = true;
			XML.ignoreComments = true;
 
 
			// Initializes NET objects
			xml_ul = new URLLoader();
			xml_ul.addEventListener (Event.COMPLETE, xmlCompleteListener);
			xml_ul.addEventListener (IOErrorEvent.IO_ERROR, errorListener);
 
			xml_ur = new URLRequest();
			xml_ur.url = path;
 
			xml_uv = new URLVariables();
 
 
			// Initializes Timer object
			timer = new Timer(50, 1);
			timer.addEventListener(TimerEvent.TIMER, timerListener);
 
			timer.start();
 
 
		}// end constructor
 
 
		/**
		 * Timer EventListener
		 * Loads an XML file after some time
		 */
		private function timerListener(evt:TimerEvent):void{
			loadXML();
		}// end timerListener
 
 
		/**
		 * Loads an XML file
		 */
		private function loadXML():void{
 
			if(path.indexOf("?") >= 0){
				// If the url already contains parameters, attaches the random seed to the end of the url
				xml_ur.url = path + "&randomSeed=" + Math.floor(Math.random() * 1000000);
			}else{
				// If the url does not contain parameters, uses an URLVariable object
				xml_uv.randomSeed = Math.floor(Math.random() * 1000000);
				xml_ur.data = xml_uv;
			}
 
			xml_ul.load (xml_ur);
 
		}// end loadXML
 
 
		/**
		 * XML Complete EventListener
		 */
		private function xmlCompleteListener(evt:Event):void{
 
			// Sets the defualt parse state to false
			var parsed:Boolean = false;
 
			var str:String = evt.target.data;
 
			var xmldoc:XMLDocument = new XMLDocument();
			xmldoc.ignoreWhite = true;
 
			try{
 
				// Parses the loaded data into an XMLDocument
				xmldoc.parseXML(str);
 
				// Gets a string from the first node of the XMLDocument
				str = xmldoc.firstChild.toString();
 
				// Parses the string into an XML
				xml = new XML(str);
 
				// If no error has occured, sets the parse stae to true
				parsed = true;
 
			}catch(e){
 
				// If an error occured, loads the XML again
				timer.start();
 
			}// end try catch
 
 
			// If the parse process done without errors and the returnFunction is NOT null, returns the XML data
			if(parsed){
				if(returnFunction != null){
					returnFunction(xml);
				}
			}
 
 
		}// end xmlCompleteListener
 
		/**
		 * XML IOError EventListener
		 */
		private function errorListener(evt:IOErrorEvent):void{
 
			if(errorFunction != null){
				errorFunction(evt);
			}
 
		}// end xmlErrorListener
 
 
	}// end class
 
}// end package
1
2
3
4
5
6
7
8
9
10
11
12
import	com.hangunsworld.as3.net.XMLLoader;
 
var xloader:XMLLoader;
xloader = new XMLLoader(xmlPath, xmlLoaded, xmlErrorListener);
 
function xmlLoaded(xx:XML):void{
	// xml loaded
}
 
function xmlErrorListener(evt:IOErrorEvent):void{
	trace("xml load error");
}

5 thoughts on “XMLLoader, a custom class.”

  1. I’ve been trying to figure out how to do this for two days. I found your code, plugged it in, and it works great. Thanks!

  2. 3.0 초보입니다.
    이번에 xml을 사용 하면서 파싱이 됐다안됐다해서 며칠 고민했는데,
    덕분에 잘 해결 했습니다. 고맙습니다.~~^^

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다