使用 XML 类

动作脚本 XML 类的方法(例如 appendChild()removeNode()insertBefore())使您可以在 Flash 中组织要发送到服务器的 XML 数据,并且它们还可以操作和解释下载的 XML
数据。

下面的 XML 类方法使用 HTTP POST 方法将 XML 数据发送并加载到服务器。

例如,您可创建一个代理系统,它在数据库中存储它的所有信息(用户名、密码、会话 ID、公文包以及事务信息)。

在 Flash 和数据库之间传递信息的服务器端脚本以 XML 格式读出和写入数据。可用动作脚本将 SWF 文件中收集到的信息(例如,用户名和密码)转换成一个 XML 对象,然后将数据作为 XML 文档发送到服务器端脚本。您还可以使用动作脚本加载服务器返回到 XML 对象中的 XML 文档,该文档将在 SWF 文件中使用。

Flash 影片、服务器端脚本和数据库之间的数据流以及数据转换

代理系统的密码验证需要两个脚本:一个在第 1 帧中定义的函数,一个脚本,该脚本创建和发送附加到窗体中“Submit”按钮的 XML 对象。

当用户用变量 usernamepassword 将他们的信息输入到 SWF 文件中的文本字段时,变量必须先转换成 XML 再发送到服务器。脚本的第一部分将变量加载到新创建的名为 loginXML 的 XML 对象中。当用户单击“Submit”按钮时,loginXML 对象先被转换成 XML 字符串,然后发送到服务器。

下面的脚本附加到“Submit”按钮。为了理解此脚本,请阅读注释行(用字符 // 表示):

on (release) {
  // A. Construct an XML document with a LOGIN element
  loginXML = new XML();
  loginElement = loginXML.createElement("LOGIN");
  loginElement.attributes.username = username;
  loginElement.attributes.password = password;
  loginXML.appendChild(loginElement);

  // B. Construct an XML object to hold the server's reply
  loginReplyXML = new XML();
  loginReplyXML.onLoad = onLoginReply;

  // C. Send the LOGIN element to the server,
  //    place the reply in loginReplyXML
  loginXML.sendAndLoad("https://www.imexstocks.com/main.cgi",
              loginReplyXML);
}

当用户单击“Submit”按钮时,脚本的第一部分生成下面的 XML:

<LOGIN USERNAME="JeanSmith" PASSWORD="VerySecret" />

服务器接收到这个 XML,生成一个 XML 响应,然后将它回送给 SWF 文件。如果接受了该密码,服务器会通过下面的代码进行响应:

<LOGINREPLY STATUS="OK" SESSION="rnr6f7vkj2oe14m7jkkycilb" />

这个 XML 包括一个 SESSION 属性,该属性包含一个唯一的随机生成的会话 ID,它将被用在该会话其余部分客户端和服务器之间的所有通讯中。如果拒绝了该密码,服务器会通过下面的消息进行响应:

<LOGINREPLY STATUS="FAILED" />

LOGINREPLY XML 节点必须加载到 SWF 文件的空白 XML 对象中。下面的语句创建 XML 对象 loginreplyXML 来接收 XML 节点:

// B. Construct an XML object to hold the server's reply
loginReplyXML = new XML();
loginReplyXML.onLoad = onLoginReply;

第二个语句将 onLoginReply() 函数指定给 loginReplyXML.onLoad 处理函数。 

LOGINREPLY XML 元素异步到达(与从 loadVariables() 函数得出的数据类似),然后加载到 loginReplyXML 对象中。当数据到达时,即会调用 loginReplyXML 对象的 onLoad 处理函数。您必须定义 onLoginReply() 函数,然后将其指定给 loginReplyXML.onLoad 处理函数,以便它可以处理 LOGINREPLY 元素。您还必须将 onLoginReply() 函数指定给包含“Submit”按钮的帧。

onLoginReply() 函数是在 SWF 文件的第 1 帧中定义的。(为了理解此脚本,请阅读注释行。)

function onLoginReply() {
  // Get the first XML element
  var e = this.firstChild;
  // If the first XML element is a LOGINREPLY element with
  // status OK, go to the portfolio screen.Otherwise,
  // go to the login failure screen and let the user try again.
  if (e.nodeName == "LOGINREPLY" && e.attributes.status == "OK") {
// Save the session ID for future communications with server
  sessionID = e.attributes.session;
// Go to the portfolio viewing screen
    gotoAndStop("portfolioView");
  } else {
    // Login failed!Go to the login failure screen.
    gotoAndStop("loginFailed");
  }
}

该函数的第一行 var e = this.firstChild 使用关键字 this 来引用刚刚从服务器通过 XML 加载的 XML 对象 loginReplyXML。您可以使用 this,原因是 onLoginReply() 已作为 loginReplyXML.onLoad 进行调用,所以尽管 onLoginReply() 看上去是一个标准函数,实际上它充当 loginReplyXML 的一个方法。

要以 XML 的形式将用户名和密码发送到服务器,然后将 XML 响应加载到 SWF 文件中,您可以使用 sendAndLoad() 方法,如下所示:

// C. Send the LOGIN element to the server,
//    place the reply in loginReplyXML
  loginXML.sendAndLoad("https://www.imexstocks.com/main.cgi", loginReplyXML);

注意:这个设计方案只是一个例子,Macromedia 不保证它的安全性级别。如果您正实施一个安全的密码保护系统,请确保对网络安全有很好的理解。

有关更多信息,请参见“在 Web 应用程序中集成 XML 和 Flash”XML 类