Flex(ActionScript3)解析XML

正文:

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

Flex(ActionScript3)解析XML

(图片来自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); }

你可能感兴趣的:(Flex,as解析xml)