⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 marshaller.as

📁 使用Flash提供的Web Service的能力
💻 AS
字号:
class XMLRPC.Marshaller {
	public var xml:XML;
	
	public function ASToXML(fn_name:String, fn_params:Array) {
		//build an xmlrpc request from a ActionScript variables
		xml = new XML();
		
		//build the root node
		var mc = xml.createElement("methodCall")
		xml.appendChild(mc);
		
		//build the method name part of the request
		var mn = xml.createElement("methodName")
		mc.appendChild(mn);
		mn.appendChild(xml.createTextNode(fn_name));
		
		//create a params node
		var pms = xml.createElement("params");
		mc.appendChild(pms);
		
		//use the addArray method to start 
		this.addArray(pms, "param", fn_params);
		
		return xml;		
	}
	
	private function addArray(parent:XMLNode, element_name:String, list:Array) {
		//cycle through the params list and build nodes appropriately
		for(var i=0; i < list.length; i++) {
			//build a new array element
			var p = xml.createElement(element_name);
			
			//get the value for this element
			var val = list[i];
			
			//determine the type of content we're adding
			switch(typeof(val)) {
				case "string":
					addScalar(p, "string", val);
					break;
				case "boolean":
					addScalar(p, "boolean", String(Number(val)));
					break;
				case "number":
					var decimal = val - Math.floor(val);
					//no decimal (exactly) so it's an int
					if(decimal == 0) {
						addScalar(p, "int", String(val));
					} else {
						addScalar(p, "double", String(val));
					}
					break;
				case "object":
					//determine the specific class of this object
					if (val instanceof Date) {
						//date object is special, treat it as a scalar type
						var ds = convertDate(val);
						addScalar(p, "dateTime.iso8601", ds)
					} else if(val instanceof XMLRPC.Base64) {
						//it's a base64 string
						addScalar(p, "base64", val.Data);	
					} else if(val instanceof Array) {
						//it's an array
						var a = xml.createElement("array");
						p.appendChild(a);
						var d = xml.createElement("data");
						a.appendChild(d);
						addArray(d, "value", val);
					} else {
						//it's a generic object, treat it as a struct
						var d = xml.createElement("struct");
						p.appendChild(d);						
						addStruct(d, val);
					}
					break;
			}
			parent.appendChild(p);
		}
	}
	
	private function convertDate(val:Date) {
		var year = val.getUTCFullYear();
		var month = val.getUTCMonth()+1;
		var date = val.getUTCDate();
		var hour = val.getUTCHours();
		var minute = val.getUTCMinutes();
		var second = val.getUTCSeconds();
		
		//append necessary zeros to fill out the field
		if(year < 1000) {
			if(year < 10) {
				year = "000"+String(year);
			} else if (year < 100) {
				year = "00"+String(year);
			} else {
				year = "0" + String(year);
			}
		}
		if(month < 10) {
			month = "0"+String(month);
		}
		if(date < 10) {
			date = "0"+String(date);
		}
		if(hour < 10) {
			hour = "0"+String(hour);
		}
		if(minute < 10) {
			minute = "0"+String(minute);
		}
		if(second < 10) {
			second = "0"+String(second);
		}
		
		//build the iso8601 compliant date
		var ds = String(year)+String(month)+String(date);
		ds += "T"+String(hour)+":"+String(minute)+":"+String(second);
		return ds;
	}
	
	private function addScalar(parent:XMLNode, type:String, val) {
		//add a new string
		var e = xml.createElement(type);
		parent.appendChild(e);
		var t = xml.createTextNode(val);
		e.appendChild(t);
	}
	
	private function addNameValue(parent:XMLNode, name:String) {
		var n = xml.createElement("name");
		parent.appendChild(n);
		var t = xml.createTextNode(name);
		n.appendChild(t);

		var n = xml.createElement("value");
		parent.appendChild(n);
		return n
	}
	
	private function addStruct(parent:XMLNode, struct:Object) {
		//cycle through all the properties of the struct
		for(var name in struct) {
			//build a new array element
			var p = xml.createElement("member");
			
			//get the name and value for this element
			var val = struct[name];
			
			//determine the type of content we're adding
			switch(typeof(val)) {
				case "string":
					var n = addNameValue(p, name);
					addScalar(n, "string", val);
					break;
				case "boolean":
					var n = addNameValue(p, name);
					addScalar(n, "boolean", String(Number(val)));
					break;
				case "number":
					var n = addNameValue(p, name);
					var decimal = val - Math.floor(val);
					//no decimal (exactly) so it's an int
					if(decimal == 0) {
						addScalar(n, "int", String(val));
					} else {
						addScalar(n, "double", String(val));
					}
					break;

				case "object":
					//determine the specific class of this object
					if (val instanceof Date) {
						//date object is special, treat it as a scalar type
						var ds = convertDate(val);
						var n = addNameValue(p, name);
						addScalar(n, "dateTime.iso8601", ds);
					} else if(val instanceof XMLRPC.Base64) {
						//it's a base64 string
						var n = addNameValue(p, name);
						addScalar(n, "base64", val.Data);
						
					} else if(val instanceof Array) {
						//it's an array, add the name and value
						var n = addNameValue(p, name);
						var a = xml.createElement("array");
						n.appendChild(a);
						var d = xml.createElement("data");
						a.appendChild(d);
						addArray(d, "value", val);
						
					} else {
						//it's a generic object, treat it as a struct
						var n = addNameValue(p, name);
						var d = xml.createElement("struct");
						n.appendChild(d);
						addStruct(d, val);
					}
					break;
			}
			parent.appendChild(p);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -