Flash AS与XML数据交互-Flash actionscript

2016-03-18 15:37 63 1 收藏

最近很多朋友喜欢上PS,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - FLASH 】

在AS3里,对XML的控制变得非常方便了,有用过AS2的读者都知道,如果我们用AS2去访问一个节点,做法是xmlObj.firstChild.childNodes[2]如果复杂的XML结构就更麻烦了,所以在AS2时需要把一系统的节点用一个值来先做替身即xmlList= xmlObj.firstChild.childNodes来降底程序的复杂程序。

AS3里使用E4X(ECMAScript for XML)来规范定义组用于处理 XML 数据的类和功能。E4X 类的方法、属性和运算符实现以下便利:

简单:在可能的情况下,使用 E4X 可以更容易地编写和理解用于处理 XML 数据的代码。

一致:E4X 背后的方法和推理在内部是一致的,并与 ActionScript 的其它部分保持一致。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/flash/)

熟悉:使用众所周知的运算符来处理 XML 数据,如点 (.) 运算符。

E4X 类有包括XML、XMLList、QName 和 Namespace。下面我们来看看XML类,如何创建修改XML文件。

11.3.1  声明XML对象

XML 对象可能表示 XML 元素、属性、注释、处理指令或文本元素。

声明一个XML对象基本语法如下:

var xml:XML=new XML(myxmlxml文件/myxml)

 

使用new XML()创建XML对象,AS3声明XML对象比较灵活了,XML对象里的内容可以用引号也可以像上面的代码不使用引号。更直接的声音方式直接赋值,只要XML结构是正确的就行,如下:

var xml=

    myxml

        item id='1'

             menuNameburger/menuName

             price3.95/price

        /item

    /myxml

trace(xml.toXMLString())

 

 

 

 

 

 

 

 

第8行,使用对象的toXMLString()方法输出xml,这个方法要和toString()区分开来,还有一个是输出XML文本结点的方法text(),我们先来区分一下这三个方法,便于我们后面的学习。

范例如下:

var xml:XML=

         body

             text1

             barbarText1/bar

             barbarText1/bar

             text2

         /body

trace(xml.text());//输出:text1text2

trace(xml.text()[0]);//输出:text1

trace(xml.text()[1]);//输出: text2

trace(xml.child(1).toXMLString());//输出:barbarText1/bar

trace(xml.child(1).toString());//输出:barText1

Ø        

 

 

 

 

 

 

 

 

 

 

 

 

toXMLString()方法:始终返回XML 对象的开始标签、属性和结束标签的字符串型式。

toString()方法:只是按字符串形式返回节点的内容。

text()方法:则是返回XML 文本节点的所有 XML 属性的 XMLList 对象,上面的例子,有两个文本节点text1和text2。

11.3.2  XML节点访问

存取节点是使用XML对象的基础,要用好XML先要掌握管理XML类的方法,XML类提供了以下各管理节点的方法。

1.访问XML各节点。

在学习访问XML节点前,要先弄明白XML各层次的关系后面,要使用这个层级与节点编号来访问不同位置的节点。

虽然我们看来,itemtext1item只是一段包含item卷标元素的字符串而以,但是经过Flash内部的XML解析器处理后,XML里的每个元素都会被展现成树状的层级结构,各层之间都存在规律性的编号。我们把下面的代码分解如图11-12所示。

var xml:XML=

    myxml

        item

             proproText/pro

        /item

        itemtext1/item

        itemtext2/item

    /myxml

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/flash/)

 

 

 

 

 

 

 

 

图11-12用IE浏览XML文件

上图中,红色方块表示卷标,黑色方块表示文字元素。XML中卷标和文字元素都算是一个节点。XML结构如同一个二维表对横向和纵向进行编号,我们常要使用这个编号访问各节点。

在AS2里,我们常使用xmlObj.firstChild.childNodes[0]来访问节点。AS3里我们有很多方法来访问不同位置的节点,首先介绍使用child()访问节点。

① child()方法 (propertyName:Object):XMLList

使用child()方法列出其子项,一个XML子项就是一个XML元素、文本节点、注释或处理指令。代码如下:

var xml:XML=

         foo

             bartext1/bar

             bartext1/bar

         /foo

trace(xml.child("bar").length());

//输出2

trace(xml.child("bar")[0].toXMLString());

//输出: bartext1/bar

trace(xml.child("bar") [1].toXMLString ());

//输出: bartext2/bar

 

 

 

 

 

 

 

 

 

 

child()方法,可以直接使用子项目编号来读取,及child(1)比如上面的xml对象,我们用xml.child("bar")[0]和xml.child(1)输出结果是一样的。如果用*号代替编号则表示输出所有节点,范例代码如下:

var xml:XML=

         foo

             bartext1/bar

          ,    bartext1, /bar

         /foo

trace(xml.child("bar")[0].toXMLString());

//输出: bartext1/bar

trace(xml.child(0).toXMLString());

//输出: bartext1/bar

trace(xml.child("*").toXMLString ());

//输出:bartext1/bar bartext2/bar

 

 

 

 

 

 

 

 

 

 

 

 

② children()方法 (propertyName:Object):XMLList

children()按照XML对象的显示顺序列出其子项。一个XML子项就是一个XML元素、文本节点、注释或处理指令。和child()方法不同,child只是读取单个子项的,而children()是读取所有的子项。我们也可以按子项编号用children()来完成child()的工作,下面用个范例做个对比,如下:

var xml:XML=

         foo

             bartext1/bar

             bartext2/bar

         /foo

trace(xml.children());

//输出: bartext1/barbartext2/bar

trace(xml.children()[0].toXMLString());//输出text1

trace(xml.child(0).toXMLString());//输出text1

 

 

 

 

 

 

 

 

 

代码中,第6行children()没有用编号时,则读取所有的子项结点。第8行,xml.children()[0]读取编号为0的节点,这和第9行使用child()方法读取单条节点项的作用是一样的。

③ elements () 方法 (name:Object = *):XMLList

elements()方法可以列出XML对象的元素。一个由开始和结束标签组成的元素,可以使用参数name,用节点名子访问,也可以使用*访问所有节点。范例如下:

var xml:XML=

         body

             barbarText1/bar

             barbarText2/bar

         /body

trace(xml.elements("*"));//输出: barbarText1/barbarbarText2/bar

trace(xml.elements("*")[0].toXMLString());//输出: barbarText1/bar

trace(xml.elements("bar").length());//输出: 2

trace(xml.elements("bar")[1].toXMLString());//输出: barbarText2/bar

 

 

 

 

 

 

 

 

elements()看起来和children()一样,都是读取XML对象的所有子项。这两个方法是有区别的,而且区别很大。elements()只是读取XML对象的元素,如barbatTextbar/或者单个元素bar/,而children()都是读取所有的子项,包括文本节点、注释或处理指令等,只要在XML里有设置其注释与指令能输出,并可以用children()。对比范例如下:

XML.ignoreComments=false;//先设置不忽略注释才能用childern获取注释

XML.ignoreProcessingInstructions=false;//先设置不忽略XML指令

var myxml:XML=

         body

             bar44/bar

             dtext

             !--这是注释--

             btt/

?一个指令?

         /body;

trace(myxml.children().toXMLString());

/*输出所有子项:

             bar44/bar

             dtext

             !--这是注释--

             btt/

?一个指令?

*/

trace(myxml.elements("*").toXMLString());

//输出: bar44/bar btt/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

对比下第11行和第19行,两种方法输出的子项,现在可以很显视地区分这两个方法了。

④ descendants()方法 (name:Object = *):XMLList

 descendants()是读取包含给定 name 参数的 XML 对象的所有后代(子级、孙级、曾孙级等)。这和前面介绍的几个方法又有所不同了,前面介绍的child()、children()和elements()都只是读取所指点的那层的子项,而这个descendants()是读取其下面所有的层级子项,所用的参数和elements()是一样可以使用参数name,用节点名子访问,也可以使用*访问所有节点。范例如下:

var xml:XML=

         body

             a

                 btext1/b

             /a

             btext2/b

         /body

trace(xml.descendants("b").toXMLString());//输出: bartext1/barbartext2/bar

trace(xml.child("b").toXMLString());//输出: bartext1/bar

 

 

 

 

 

 

 

 

 

 

对比下使用descendants()和child()读取节名b后的区别,child()只是从当前层读取节点b,descendants()则读取XML对象里所有节点名为b的节点,我们可以xml.descendants("b")[1]用编号去选取需要访问的结点,从而在不清楚XML对象里节点名为b的层次位置也能很好的访问。

⑤ .dot (XML) 运算符

这里,还可以使用点运算符来读取XML的结点,别看这个小不点点运算符在AS里的并不莫生,作用也大着。AS2时代,我们使用点运算符来向影片剪辑的深层次访问变量,现在XML的层级关系里,一样可以灵活地运用点运算符来问了。范例如下:

var xml:XML=

         foo

     &nbs, p;      , ; bartext1/bar

             bartext2/bar

         /foo

 

trace(xml.bar);

//输出: bartext1/barbartext2, /bar

trace(xml.bar[1].toXMLString());

//输出: bartext2/bar

 

 

 

 

 

 

 

 

 第6行,使用点运算符,直接访问节点名则获得他所有的子项这和上面介绍的xml.children()作用一样,只是children可以在未知节点名的情况下获取所有子项,第8行则跟child(1)的作用一样了。

⑥ 使用parent()访问上一级节点

在AS2里,访问上一个节点是使用parentNode,还有firstChild、lastChild、nextSibling等等,层级之间的访问方法比较多。

现在AS3的XML类对于层级之间的访问方法只留了个parent()其它的都被去了。因为XML对象的访问很灵活了,在AS2时所用的很多方法都可以使用别的来替代了。我们来看下parent的使用,第11行,声明对象,一个在xml结点上位置第三层的li1/li,然后在第14行用parent()查看下他上一级是什么,则输出节点ul。代码如下:

var xml:XML=

         top

             pchild0/p

        &n, bsp;    p

                ul

li1/li

li2/li

/ul

             /p

         /top;

var node:XML=xml.child("p")[1].child("ul").child("li")[1];

//上面的,表示把li1li给node对象

//我们再用node.parent()看看他上一个节点是什么

trace(node.parent());

/*输出node的上一个节点所有子项

ul

li1/li

li2/li

/ul

*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

⑦ childIndex()方法

childIndex()方法不是用来读取节点的,是用来获取节点的位置,其父项上下文中从0开始编制索引的位置,范例如下:

var myxml:XML=topxml

                 bartext1/bar

                 btext/

               /topxml

trace(myxml.childIndex());//输出:-1

trace(myxml.bar.childIndex());//输出:0

trace(myxml.btxt.childIndex());//输出:1

 

 

 

 

 

 

 

2.访问XML的属性

每个卷标都可以拥有一个以上的属性,这个属性可以像我们AS里的字符型变量一样存放一段字符串,访问属性XML对象提供了下面几个方法。

① attribute(attributeName:*):XMLList

使用attribute()读取与参数相符属性的值,如下:

var xml:XML=

             myxml theName="大山" theSex="男"

                item theAge="30"text1/item

             /myxml

trace(xml.attribute("theName"));//输出:大男

trace(xml. attribute("*"));//输出:大山男

trace(xml. attribute("*")[1]);//输出:男

 

 

 

 

 

 

 

attribute()可以使用*号输出下面所有属性。使用属性名读取时,属性名是区分大小写的,这和我们的变量规则一样。如图没有这个属性则输出一个空值,不会报错。

② attributes(attributeName:*):XMLList

使用attributes()返回给定 XML 对象的属性值列表。结合使用 name()方法和attributes()方法可返回属性的名称。

和上面的attribute()方法有些不一样,上面那个方法是读取单个属性值。而这个方法是读取属性值列表,所以使用xml.attribute(*)和xml.attributes()输出结果一样,都是获取所有属性,范例如下:

var xml:XML=img id=’20’ imgName=’myphoto’/

trace(xml.attribute("*"));//输出:20myphoto

trace(xml.attribute("*")[1]);//输出:myphoto

trace(xml.attribute());//输出:20myphoto

trace(xml.attribute().length());//输出:2

trace(xml.attribute()[1]);//输出:myphoto

 

 

 

 

&nbs

来源:https://www.tulaoshi.com/n/20160318/1887699.html

延伸阅读
标签: FLASH flash教程
poluoluo核心提示:剪贴板是一个软件设备,它用来暂时存贮数据,以及通过复制粘贴实现数据在文档之间的移动。 这个快速教程,我们将用Flash制作一个复制键。 剪贴板是一个软件设备,它用来暂时存贮数据,以及通过复制粘贴实现数据在文档之间的移动。 这个快速教程,我们将用Flash制作一个复制键。 最终的动画 下面的例子将是我们在这个教...
标签: FLASH flash教程
本例继续讲解AS的基础知识,今天我们来学习Flash AS入门系列教程第七课:影片剪辑第6节使用遮罩,对Flash的AS编程有兴趣的朋友可以到论坛与作者交流。 上一篇文章:Flash as入门(11):拖动与碰撞检测 第6节 使用遮罩 遮罩是flash动画制作常使用的一种技术。它可形面一个空洞使被遮盖的对象能透过空洞成形为可见。在flash舞台上常使用遮罩...
标签: FLASH flash教程
poluoluo核心提示:在这个教程中我们将学习如何用Flash AS3来得到鼠标的当前方位。我们可以用此为游戏创建有趣的控制方法,例如可把鼠标当作一个游戏控制杆。现在我们先展示一下我们的作品。 快速教程:如何用ActionScript侦测鼠标的位置 在这个教程中我们将学习如何用Flash AS3来得到鼠标的当前方位。我们可以用此为游戏创建有趣的控制方...
标签: FLASH flash教程
本例继续讲解AS的基础知识,今天我们来学习Flash AS入门系列教程第七课:影片剪辑第10节用AS绘图,教程详细讲解了运用AS绘制各种图形的方法,对Flash的AS编程有兴趣的朋友可以到论坛与作者交流。 上一篇文章:Flash as入门(15):filters类滤镜 用AS绘图 AS2.0这我们提供了一些绘图方法,利用这些方法,我们可以绘制一些图形。下面来认识一下...
标签: FLASH flash教程
创建文档类(Document class) 现在我们对类已经了一定的了解,接下来,看看如果真正地使用它。有时候我常说基于 AS 3的 SWF 是多么的重要,这是因为 AS 3 引入了一个全新的概念,文档类(document class)。 一个文档类就是一个继承自 Sprite 或 MovieClip 的类,并作为 SWF 的主类。读取 SWF时,这个文档类的构造函数会被自动调用。它就成为...

经验教程

385

收藏

72
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部