`
hdxiong
  • 浏览: 372978 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex(ActionScript3)解析XML

    博客分类:
  • Flex
阅读更多

对于如下的一个XML文档,在flash中应该怎么读呢?

(图片来自kirupa.com)

按照Using XML in Flash CS3/AS3上的内容,包括了XML结构介绍等内容,在此我不再转述,对XML不怎么了解的话请先移步:XML 系列教程

这里我分三步描述flash读XML的基本方法,以及外延一个对带命名空间的XML的读取方法,如下目录:

1、加载XML文件;
2、读取XML的数据;
3、过滤数据;
4、读取带命名空间的XML数据;
5、处理gb2312编码的XML;

注:在这里的AS脚本都是在 Adobe Flash CS3 版本以上中进行编写,flex用户请自行添加修改相应的包引用。

下面开始第一部分,如何加载XML文件!

1、加载XML文件

在脚本编辑器中写入以下代码:

var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = null;
 
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("http://www.kirupa.com/net/files/sampleXML.xml"));
 
function LoadXML(e:Event):void {
  xmlData = new XML(e.target.data);
  trace(xmlData);
}

按Ctrl+Enter运行它,你会在输出窗口中看到整个XML的内容:
输出窗口
这里不进行代码解说,关于XML类,请查看:http://help.adobe.com/zh_TW/AS3LCR/Flash_10.0/XML.html

下面进入第2部分:如何读取XML数据。

2、读取XML数据

2.1直接读取XML数据

对XML数据的读取是十分简单的,不信请看:

function LoadXML(e:Event):void {
  xmlData = new XML(e.target.data);
  ParseBooks(xmlData);
}
 
function ParseBooks(bookInput:XML):void {
  trace("XML Output");
  trace("------------------------");
  trace(bookInput.Book);
}

可得到如何结果:

XML Output
------------------------
 
  Sir Arthur Conan Doyle
 
  F. Scott Fitzgerald
 
  Stephen E. Ambrose
 
  Stephen E. Ambrose

同样的,把trace的内容改为bookInput.Book.author,会得到下面的结果:

XML Output
------------------------
Sir Arthur Conan Doyle
F. Scott Fitzgerald
Stephen E. Ambrose
Stephen E. Ambrose

而trace(bookInput.Book.author.text());可得到:

XML Output
------------------------
Sir Arthur Conan DoyleF. Scott FitzgeraldStephen E. AmbroseStephen E. Ambrose

同样的,要读具体的节点,可以这样

trace(bookInput.Book.author.text()[0]);

可得到

XML Output
------------------------
Sir Arthur Conan Doyle

2.2、XML和XMLList

这里我们会用到另外一个类XMLList,这个类可以把XML对象作为数组的方式读取,可以方便地进行for each操作。

function ParseBooks(bookInput:XML):void {
  trace("XML Output");
  trace("------------------------");
  var authorList:XMLList = bookInput.Book.author;
  for each (var authorElement:XML in authorList) {
    trace(authorElement);
  }
}

 2.3历遍子元素

function ParseBooks(bookInput:XML):void {
  trace("XML Output");
  trace("------------------------");
  var bookChildren:XMLList = bookInput.Book.children();
  for each (var bookInfo:XML in bookChildren) {
    trace(bookInfo);
  }
}

结果如下:

XML Output
------------------------
Sherlock Holmes: Complete Novels and Stories, Vol 1
Sir Arthur Conan Doyle
The Great Gatsby
F. Scott Fitzgerald
Undaunted Courage
Stephen E. Ambrose
Nothing Like It In the World
Stephen E. Ambrose

同样的,我们可以用节点的.name()方法得知它的标签名:

function ParseBooks(bookInput:XML):void {
  trace("XML Output");
  trace("------------------------");
  var bookChildren:XMLList = bookInput.Book.children();
  for each (var bookInfo:XML in bookChildren) {
    if (bookInfo.name() == "author") {
      trace(bookInfo);
    }
  }
}

这样就可以得到所有author的值了。

2.4读取属性

历遍属性的方法:

function ParseBooks(bookInput:XML):void { 
  trace("XML Output"); 
  trace("------------------------"); 
  var bookAttributes:XMLList = bookInput.Book.attributes(); 
  for each (var bookISBN:XML in bookAttributes) { 
    trace(bookISBN); 
  } 
}

对于attributes,同样有一个.name()方法:

function ParseBooks(bookInput:XML):void { 
  trace("XML Output"); 
  trace("------------------------"); 
  var bookAttributes:XMLList = bookInput.Book.attributes(); 
  for each (var bookISBN:XML in bookAttributes) { 
    if (bookISBN.name() == "ISBN") { 
      trace(bookISBN); 
    } 
  } 
}

另外还有一种更直接的方法,直接用.attribute(“ISBN”) :

function ParseBooks(bookInput:XML):void { 
  trace("XML Output"); 
  trace("------------------------"); 
  var bookAttributes:XMLList = bookInput.Book.attribute("ISBN"); 
  for each (var bookISBN:XML in bookAttributes) { 
    trace(bookISBN); 
  } 
}

注意,这个.attribute(attributeName:*)方法不是.attributes()哦,少了个s的哦。

3、过滤数据

3.1过滤值

function ParseBooks(bookInput:XML):void { 
  trace("XML Output"); 
  trace("------------------------"); 
  var authorList:XMLList = bookInput.Book.(author == "Stephen E. Ambrose"); 
  trace(authorList); 
}

可得到:

XML Output
------------------------
<Book ISBN="0684826976">
  <title>Undaunted Courage</title>
  <author>Stephen E. Ambrose</author>
</Book>
<Book ISBN="0743203178">
  <title>Nothing Like It In the World</title>
  <author>Stephen E. Ambrose</author>
</Book>

所以在过滤之后,可以同样使用

var authorList:XMLList = bookInput.Book.(author == "Stephen E. Ambrose").title;

得到所有作者是Stephen E. Ambrose的书名了。

3.2过滤属性

function ParseBooks(bookInput:XML):void { 
  trace("XML Output"); 
  trace("------------------------"); 
  var bookList:XMLList = bookInput.Book.(@ISBN == "0743203178").title; 
  trace(bookList); 
}

我们还可以进行一些复杂的过滤:

function ParseBooks(bookInput:XML):void { 
  trace("XML Output"); 
  trace("------------------------"); 
  var bookList:XMLList = bookInput.Book.(author == "Stephen E. Ambrose" && title != "Nothing Like It In the World").title; 
  trace(bookList); 
}

4、读取带命名空间的XML数据

如果把上面的XML文件改一改,变成如下:

<Books xmlns:g="http://guitarbean.com/">
  <Book ISBN="0553212419">
    <title>Sherlock Holmes: Complete Novels and Stories, Vol 1</title>
    <author>Sir Arthur Conan Doyle</author>
  </Book>
  <Book ISBN="0743273567">
    <title>The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
  </Book>
  <Book ISBN="0684826976">
    <title>Undaunted Courage</title>
    <author>Stephen E. Ambrose</author>
  </Book>
  <Book ISBN="0743203178">
    <title>Nothing Like It In the World</title>
    <author>Stephen E. Ambrose</author>
    <g:cost>XXXXXXX</g:cost>
  </Book>
</Books>

这时要用到Namespace类了:

function ParseBooks(bookInput:XML):void { 
  trace("XML Output"); 
  trace("------------------------");
  var g:Namespace = new Namespace("http://guitarbean.com/"); 
  trace(bookInput.Book.g::cost); 
}

可得到:

XML Output
------------------------
XXXXXXX

这里的双冒号(::)就是命名空间符,只要建立了一Namespace对象,XML对象便可直接用点运算符来操作了,相对的比较方便。

5、处理gb2312编码的XML

有的XML文件可能不是UTF8的,如在中国常用的gb2312编码,侧需要转码一下,这时要用到ByteArray类,在建立XML对象前统一处理下即可:

var xmlLoader:URLLoader = new URLLoader();
var xmlData:XML = null;
 
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("http://www.kirupa.com/net/files/sampleXML.xml"));
 
function LoadXML(e:Event):void {
  var BA:ByteArray = new ByteArray;
  BA.writeBytes((e.target as URLLoader).data);
  BA.position = 0;
 
  //把gb2312转为UTF8编码:
  var newData:String = BA.readMultiByte(BA.length,"gb2312");
  //然后才建立XML对象:
  xmlData = new XML(newData);
  trace(xmlData);
}

本文转自:http://blog.guitarbean.com/2009/12/actionscript3-reading-xml.html

分享到:
评论
1 楼 enjoyjava 2010-11-14  
同样的,我们可以用节点的.name()方法得知它的标签名:
function ParseBooks(bookInput:XML):void {
  trace("XML Output");
  trace("------------------------");
  var bookChildren:XMLList = bookInput.Book.children();
  for each (var bookInfo:XML in bookChildren) {
    if (bookInfo.name() == "author") {
      trace(bookInfo);
    }
  }
}
你这里写错了吧?我看文档里bookInfo.name().localName才能得到标签名。。。。。。

相关推荐

    ActionScript 3.0 API文档及Flex开发详解电子书

    Flex技术本身并不是凭空出现的,经过了Flash的长期预热,依托于XML、ActionScript 3.0等标准化开发语言,终成正果。 本书以实践为手段,以实用为核心,全面解析了应用Flex技术进行RIA开发的思维与过程。从实践开始...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    ActionScript开发人员指南中文版

    在ActionScript中使用XML的示例:从Internet加载RSS数据 第章:使用本机JSON功能 JSONAPI概述 定义自定义JSON行为 第章:处理事件 事件处理基础知识 ActionScript事件处理与早期版本事件处理的不同之处 事件流 事件...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    flex3的cookbook书籍完整版dpf(包含目录)

    第一章.Flex与ActionScript基础(3) 1.1节.用FlexBuilder创建Flex项目 1.2节.用FlexBuilder创建Flex库项目 1.3节.创建ActionScript项目 1.4节.在FlexBuilder中设置MXML编译器选项 1.5节.在FlexBuilder外部编译Flex...

    Cairngorm框架在Flex开发中的应用研究.nh

    3章Caimgorm框架的研究......................... 3.1对Caimgorm框架分析........................ 3.1.1MVC开发模式简介.................... 3.1.2caimgorm的组成及功能............ 3.1.3caimgorm的程序开发流程....

    guepard:将Flash转换为html5转换器,将as3转换为javascript转换器

    解析AS3代码 分析代码并修复未知类型 导出JS代码 生成HTML页面 用法(Windows,Mac,Linux) 安装Adobe AIR 安装 AIR应用程序 从/ sdk下载Guepard SDK并将其提取到您的文件夹中 启动应用程序并创建新项目 根据需要...

    计算机精品学习资料大放送

    ActionScript、Flex、AIR等RIA技术相关资料下载汇总 最强HTML/xHTML、CSS精品学习资料下载汇总 最新JavaScript、Ajax典藏级学习资料下载分类汇总 网络最强PHP开发工具+电子书+视频教程等资料下载汇总 UML学习...

    Spring攻略(第二版 中文高清版).part2

    10.7 将依赖注入带给你的ActionScript客户 434 10.7.1 问题 434 10.7.2 解决方案 434 10.7.3 工作原理 435 10.8 小结 439 第11章 Grails 441 11.1 获取和安装Grails 441 11.1.1 问题 441 11.1.2 ...

    Spring攻略(第二版 中文高清版).part1

    10.7 将依赖注入带给你的ActionScript客户 434 10.7.1 问题 434 10.7.2 解决方案 434 10.7.3 工作原理 435 10.8 小结 439 第11章 Grails 441 11.1 获取和安装Grails 441 11.1.1 问题 441 11.1.2 ...

Global site tag (gtag.js) - Google Analytics