📄 marshaller.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 + -