1、xpath4as

xpath4as2是xfactorstudio提供的一个as2扩展类,支持xpth1.0。

到http://www.xfactorstudio.com/ActionScript/AS2/XPath/XPath4AS2.zip下载xpath4as2的最新版本,解压后放到\Macromedia\Flash 8\zh_cn\First Run\Classes下,重新启动flash即可.

xfactorstudio还提供了一个XmlDataSet类,可以提高处理效率。

下载:http://www.xfactorstudio.com/Actionscript/AS2/XmlDataSet/XmlDataSet.zip


2、flash中的as:

flash的sendAndLoad方法很有意思,他将传送的xml数据作为一个form请求发送出去。例如下面发送的xml片断:

<login methodName=\"login\" username=\"Admin\" password=\"111111\" />

和下面这样的请求是一样的:

Request.Form.allKeys[0]="login methodName";

Request.Form[0].toString=\"login\" username=\"Admin\" password=\"111111\";

也就是在form中提交了一个名为login methodName的键值对。


XPathAxes.stringValue是一个静态方法,用来获得指定的node类型数组的所有文本值。

XPath.selectNodes也是一个静态方法,有两个参数,参数1指定了xpath查询的内容(xmlNode),参数2是一个xpth查询字符串,该方法返回了符合指定条件的node数组。


import com.xfactorstudio.xml.xpath.*;

var targetURL:String="http://localhost/xxir/WebForm.aspx";

XML.prototype.ignoreWhite = true;


var AXML:XML = new XML();

AXML.onLoad =AXMLOnLoad;

function AXMLOnLoad(success:Boolean) {

if (success) {

var nd=XPathAxes.stringValue(XPath.selectNodes(this,"/adminOP/UserName")[0]);

trace(nd);

} else {

trace("connectionFailed");

}

}


this.login_btn.onPress=function(){

var QXML:XML = new XML();

// 创建要发送到服务器的 XML 格式的数据

var QEmn:XMLNode = QXML.createElement("QParam");

QEmn.attributes.methodName="login";

QEmn.attributes.username = "Admin";

QEmn.attributes.password = "11111";

QXML.appendChild(QEmn);

// 将 XML 格式的数据发送到服务器

QXML.sendAndLoad(targetURL, AXML);

}


上面的代码很常规,发送的请求是这样的:

<QParam password="11111" username="Admin" methodName="login" />

获得的返回值将是这样的:

<?xml version="1.0"?>

<adminOP xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<ID>

1

</ID>

<AdminName>

admin

</AdminName>

<UserName>

admin

</UserName>

<Password>

111111

</Password>

<Purview>

1

</Purview>

<LastLoginIP>

127.0.0.1

</LastLoginIP>

<LastLoginTime>

2005-10-10T07:22:22.0000000+08:00

</LastLoginTime>

<LastLogoutTime>

2005-10-10T08:22:00.0000000+08:00

</LastLogoutTime>

<LoginTimes>

2

</LoginTimes>

<RndPassword>

11111ddff

</RndPassword>

<EnableMultiLogin>

false

</EnableMultiLogin>

<AdminPurview_Article>

0

</AdminPurview_Article>

<AdminPurview_Soft>

0

</AdminPurview_Soft>

<AdminPurview_Photo>

0

</AdminPurview_Photo>

<AdminPurview_Shop>

0

</AdminPurview_Shop>

<AdminPurview_Others>

0-0-0

</AdminPurview_Others>

<arrClass_View>

0-0-0

</arrClass_View>

<arrClass_Input>

0-0-0

</arrClass_Input>

<arrClass_Check>

0-0-0

</arrClass_Check>

<arrClass_Manage>

0-0-0

</arrClass_Manage>

</adminOP>



3、asp.net处理请求和回发

首先将处理请求,返回一个XmlNode类型的值,如下:

private XmlNode getRequestXML(){

int vals = Request.TotalBytes;

byte[] bytes = Request.BinaryRead(vals);

string strContent = System.Text.Encoding.UTF8.GetString(bytes);

XmlDocument doc=new XmlDocument();

doc.LoadXml(strContent);

return doc.FirstChild;

}


然后根据请求,处理回发,这里使用了一个序列化的类adminOP,返回XmlDocument,代码如下:

private XmlDocument adminlogin(XmlNode xnd){

adminOP OP=new adminOP(xnd.Attributes["username"].Value);

XmlSerializer ops = new XmlSerializer(typeof(adminOP));

System.IO.MemoryStream bs=new MemoryStream(100);

ops.Serialize(bs,OP);

bs.Position=0;

XmlDocument doc=new XmlDocument(bs);

doc.Load(xtr);

return doc;

}

将获得序列化后的adminOP类的实例写入Response:

Response.Write(adminlogin(getRequestXML()).OuterXml);

this.Response.Flush();

最后注意在@ Page中加入contentType="text/xml"指示。


aspx.cs的代码如下:

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Xml;

using System.Xml.Serialization;

using System.IO;


namespace akscnClaw

{

public class WebForm : System.Web.UI.Page

{

private void Page_Load(object sender, System.EventArgs e)

{

Response.Write(adminlogin(getRequestXML()).OuterXml);

this.Response.Flush();

}


override protected void OnInit(EventArgs e)

{

InitializeComponent();

base.OnInit(e);

}


private void InitializeComponent()

{

this.Load += new System.EventHandler(this.Page_Load);

}


//获得XML格式的请求

private XmlNode getRequestXML(){

int vals = Request.TotalBytes;

byte[] bytes = Request.BinaryRead(vals);

string strContent = System.Text.Encoding.UTF8.GetString(bytes);

XmlDocument doc=new XmlDocument();

doc.LoadXml(strContent);

return doc.FirstChild;

}


//序列化输出结果

private XmlDocument adminlogin(XmlNode xnd){

adminOP OP=new adminOP(xnd.Attributes["username"].Value);

XmlSerializer ops = new XmlSerializer(typeof(adminOP));

System.IO.MemoryStream bs=new MemoryStream(100);

ops.Serialize(bs,OP);

bs.Position=0;

XmlDocument doc=new XmlDocument(bs);

doc.Load(xtr);

return doc;

}

}

}