Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1293450
  • 博文数量: 315
  • 博客积分: 10397
  • 博客等级: 上将
  • 技术积分: 3731
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 21:21
文章分类

全部博文(315)

文章存档

2015年(10)

2014年(3)

2013年(2)

2012年(8)

2011年(8)

2010年(29)

2009年(59)

2008年(77)

2007年(119)

分类:

2007-05-24 10:04:25

翻译的一篇国外的XML in Flash,觉得这篇文章写的不错,和大家分享下,对原文有部分删减,其中也包含了本人的一些体会。
原文出处:::URL::
作者:jen dehaan
翻译:Liu21st

文章内容索引:
1. XML介绍
2. 创建XML数据
3. 分析XML数据
4. 加载外部XML数据
5. 发送XML数据到服务器端
6. 接收XML数据从服务器端
7. 使用 xmlconnector 分析XML
8. 版本历史

1.XML介绍
今天,XML几乎成了因特网的基础。在某种特定的环境下甚至可以替代数据库,和允许用户聚合内容(在Blog界中已经非常普遍了)。
XML (全称可扩展标记语言:eXtensible Markup Language) 是一种标记语言,相比HTML有更加严格的规则。XML标记必须是闭合的,意思是说假如你有个

标记,就必须有对应的

标记结尾,或者单独使用。这也是XML满足Well-formed的基本要求。
Flash有很多方法可以和其它如ColdFusion, PHP, Perl, ASP, Java等语言来交互XML数据信息,一般可以通过
XML类的 load, send and sendAndLoad 方法或者FlashMX2004专业版中的XMLConnector类来接收和发送XML数据信息以及组件数据绑定。

2. 创建XML数据
创建一个XML对象非常简单,在脚本中添加下面的代码即可:

1 : var users_xml:XML = new XML(); 

注意上面的代码有使用一些技巧,其一就是变量的命名充分利用了FlashMX的代码提示功能,第二就是使用了强制类型申明(译者注:关于代码提示方面可参考本站的相关文章),在这里就不再赘述了。
下面就可以加载XML内容到对象实例中了。
手动追加的方式可以用:

users_xml.parseXML("Liu21st";
如果你在Flash中trace(users_xml);你会得到下面的输出:

Liu21st 

trace XML对象是个很有用的方法
还可以在申明XML对象的时候初始化数据,下面把两种方法比较下:

// 创建一个XML 类
var users_xml:XML = new XML();
users_xml.parseXML("Liu21st";
trace(users_xml);

// 第二种创建方法
var users_xml:XML = new XML("Liu21st";
trace(users_xml);

复杂一点的方法就是通过createElement, createTextNode 和 appendChild等操作添加XML数据,下面的方法创建和上面等效的XML数据:

1 : var users_xml:XML = new XML();
2 : users_xml.appendChild(users_xml.createElement("name");
3 : users_xml.firstChild.appendChild(users_xml.createTextNode("Liu21st");
4 : trace(users_xml); 


下面就要来讨论如何取得XML类中的数据信息

3. 分析XML数据
我们很快就创建好了一个XML数据,但是分析XML数据却显得相对复杂多了,在分析XML数据之前你需要了解XML的一些名词,如:节点、子节点、父节点的概念和它们之间的关联。(译者注:关于这方面概念的讨论就不在这里浪费了,可能也没有必要)
要取得子节点的值并没有这么直接了当,我们首先要通过firstChild属性来访问父级节点的子级列表中的第一个子级,nodeValue属性访问一个文本节点的值。如下面的:

// create and display an XML packet.
var users_xml:XML = new XML();
users_xml.parseXML( "Liu21st;
trace( "packet:" +users_xml);

trace( "name:" +users_xml.firstChild.firstChild.nodeValue);
/* traces Liu21st */

如果在上面的代码中只使用一个firstChild,你会发现输出的结果是null,我们来尝试下不同的输出:

trace("a:"+users_xml.firstChild.firstChild.nodeValue);
//traces a:Liu21st

trace("b:"+users_xml.firstChild.nodeValue);
// traces b:null 

trace("c:"+users_xml.nodeValue);
// traces c:null 

trace("d:"+users_xml.firstChild);
// traces d:Liu21st 

trace("e:"+users_xml.firstChild.firstChild);
// traces e:Liu21st 

现在你应该了解Flash中基本的XML访问方式,我们可以通过firstChild和nodeValue来遍历XML树的结构。

// create and display an XML packet.
var users_xml:XML = new XML();
users_xml.parseXML( "Liu21st计算机编程 深圳;
trace("packet:"+users_xml);
for (var i = 0; i  trace( "node " + i + ":" + users_xml.firstChild.childNodes[ i ].firstChild.nodeValue);
}

/* traces the following:
  packet:Liu21st计算机编程 深圳
  node 0:Liu21st
  node 1:计算机编程
  node 2:深圳
*/ 

上面的XML数据格式化查看为:


  Liu21st
  计算机编程
  深圳


这个XML节点有些复杂,使用循环语句可以依次得到每个节点的值,因为childNodes属性是个数组。除了nodeValue属性外,还有两个属性nodeName和nodeType也可以处理XML数据。
使用nodeName属性,你可以访问节点名称,如name、occupation和city。nodeType就比较复杂些,它指明节点的类型:文本节点或XML元素。我们还记得前面用createElement 和 createTextNode 方法来创建XML数据,正是对应了不同节点类型。如果是XML元素(如)则返回1,如果是文本节点(如Liu21st)则返回3。
XML不仅仅包含这些标记,你还可以给节点增加属性,看下面的例子:


  
  
  


分析XML的节点属性和之前类似:

// create and display an XML packet.
var users_xml:XML = new XML();
users_xml.parseXML( ';
for (var i = 0; i  var thisNode:XMLNode = users_xml.firstChild.childNodes[ i ];
  trace("node " + i + " (" + thisNode.nodeName+ ":" + thisNode.attributes.value);
}

/* traces the following:
  node 0 (name):Liu21st
  node 1 (occupation):计算机编程
  node 2 (city):深圳
*/ 

在FlashMX2004专业版中XML还可以通过XMLConnector 组件来加载、发送和分析,在后面会讲述。

4. 加载外部XML数据
加载外部的XML数据源可以使用XML类的load或sendAndLoad 方法。

1 : var external_xml:XML = new XML();
2 : external_xml.load( "somexmlfile.xml" ;
3 : external_xml.onLoad = function (success:Boolean) { 
4 : if (success) { 
5 : trace( "xml loaded successfully." ;
6 : } else { 
7 : trace( "xml failed to load." ;
8 : };
9 : }

如果外部XML不存在或者遇到错误,会看到类似于下面的错误信息:

xml failed to load.
Error opening URL "file:///C|/Documents%20and%20Settings//somexmlfile.xml"

如果加载成功,会在输出面板中显示:

xml loaded successfully

我们需要使用onLoad事件来侦测何时XML加载完成,因为Flash是同步的,加载XML的同时并不会暂停影片的播放来等待响应。事实上在加载XML的开始swf文件仍然在继续播放。这个概念很重要,因为你要明白在加载XML文件完成之前是无法访问XML的节点和属性的,Flash会返回undefined。
另外一个类似的事件是onData事件,onData默认会调用onLoad,除非你重新定义了onData。

01 : var external_xml:XML = new XML();
02 : external_xml.load("somexmlfile.xml";
03 : external_xml.onData = function(data:String) { 
04 : trace("XML packet loaded.";
05 : trace("packet:"+data);
06 : this.onLoad(true);
07 : };
08 : external_xml.onLoad = function(success:Boolean) { 
09 : if (success) { 
10 : trace("xml loaded successfully.";
11 : } else { 
12 : trace("xml failed to load.";
13 : }
14 : };

有一点需要注意的是onLoad和onData的参数并不相同。
要完全掌握XML,需要了解whitespace的概念(空格, tab键, 回车, 换行等),在Flash中分析的时候,这些whitespace依然会被XML类当作节点来分析,但这样并不是我们想要的。
下面是一个xml文档


  
  
  


接下来,用下面的代码来输出

01 : var external_xml:XML = new XML();
02 : external_xml.load( "somexmlfile.xml" ;
03 : external_xml.onLoad = function(success:Boolean) { 
04 : if (success) { 
05 : trace( "xml loaded successfully." ;
06 : trace(external_xml);
07 : trace( "number of children:" + this.firstChild.childNodes.length);
08 : } else { 
09 : trace( "xml failed to load." ;
10 : }
11 : };

你会看到下面的结果:

xml loaded successfully.


  

  

  


number of children:7

为了使得XML分析时不被这些whitespace干扰,可以设置ignoreWhite属性:

1 : external_xml.ignoreWhite = true;

输出结果如下:

xml loaded successfully.

number of children:3


注:如果觉得给每个XML对象设置ignoreWhite属性很麻烦,可以用:

1 : XML.prototype.ignoreWhite = true; 
5. 发送XML数据到服务器端
使用XML类的send 或 sendAndLoad 方法可以发送XML数据到服务器端语言(php、asp、cf等)开发的远程页面,这样就可以从数据库存储和接收数据,以及充分发挥服务器端语言的优势。例如你有一个用Flash开发的游戏,通过构建XML数据包然后发送到服务器端脚本,就可以实现积分榜的功能,并把前10名的分数存储在数据库中。这并不是说XML是Flash和远程脚本交换数据的唯一解决方式,事实上,解决方法众多,包括使用LoadVars类、WebService和XMLConnector 组件,甚至还可以使用Flash Remoting。
发送XML数据到远程脚本可以使用下面的代码:

XML.prototype.ignoreWhite = true;
var packet_xml:XML = new XML("Liu21st77";
var target_xml:XML = new XML();
packet_xml.xmlDecl = "";
packet_xml.sendAndLoad("::URL::  target_xml);
target_xml.onData = function(data) { 
  _root.myText.text = data;
};

这里引入了一些新的概念,第一行给每个XML对象设置了ignoreWhite属性,取代了为每个XML对象实例单独设置。接下来的两行创建了两个XML对象,第一个实例packet_xml 用来存放需要发送的数据信息,target_xml实例用来存放从服务器端返回的数据信息。
sendAndLoad使用 POST 方法将XML数据发送到指定的 URL,下载服务器的响应,然后将其加载到参数中定的 targetXMLobject 中。而send方法只是发送数据到服务器端,并不接收任何响应。这两个方法都非常有用,但有些区别,send方法会打开新的浏览器或者覆盖当前的浏览器页面,而sendAndLoad并不会打开任何浏览器窗口。
另外一个重要的概念是xmlDecl属性,它指定有关文档的 XML 声明的信息。我们知道Html的申明信息是:

而XML1.0的申明是

接下来的sendAndLoad方法就是和远端脚本交换数据了。

packet_xml.sendAndLoad("::URL::  target_xml);

其中的URL地址可以根据你的不同的服务器端脚本更换,在这里使用php、asp或cfm并不本质的区别,都是采用POST方法传递数据,不同的只是不同的脚本语言对POST数据的接收方式不同而已。
onData事件我们之前已经了解过了,可以用来保存服务器端的响应数据。
如果要使用send方法,可以换成下面的代码:

XML.prototype.ignoreWhite = true;
var packet_xml:XML = new XML("Liu21st77";
packet_xml.xmlDecl = "";
packet_xml.send("::URL::  "_blank";

这段代码要比之前简洁些,它的作用是以新窗口的方式打开
阅读(1009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~