Flash AS与XML数据交互.docx
- 文档编号:10195525
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:16
- 大小:148.51KB
Flash AS与XML数据交互.docx
《Flash AS与XML数据交互.docx》由会员分享,可在线阅读,更多相关《Flash AS与XML数据交互.docx(16页珍藏版)》请在冰豆网上搜索。
FlashAS与XML数据交互
FlashAS与XML数据交互
Webjx核心提示:
在AS3里,对XML的控制变得非常方便了,有用过AS2的读者都知道,如果我们用AS2去访问一个节点,做法是xmlObj.firstChild.childNodes[2]如果复杂的XML结构就更麻烦了,所以在AS2时需要把一系统的节点用一个值来先做“替身”即xmlList=xmlObj.firstChild.childNodes来降底
在AS3里,对XML的控制变得非常方便了,有用过AS2的读者都知道,如果我们用AS2去访问一个节点,做法是xmlObj.firstChild.childNodes[2]如果复杂的XML结构就更麻烦了,所以在AS2时需要把一系统的节点用一个值来先做“替身”即xmlList=xmlObj.firstChild.childNodes来降底程序的复杂程序。
AS3里使用E4X(ECMAScriptforXML)来规范定义组用于处理XML数据的类和功能。
E4X类的方法、属性和运算符实现以下便利:
·简单:
在可能的情况下,使用E4X可以更容易地编写和理解用于处理XML数据的代码。
·一致:
E4X背后的方法和推理在内部是一致的,并与ActionScript的其它部分保持一致。
·熟悉:
使用众所周知的运算符来处理XML数据,如点(.)运算符。
E4X类有包括XML、XMLList、QName和Namespace。
下面我们来看看XML类,如何创建修改XML文件。
11.3.1声明XML对象
XML对象可能表示XML元素、属性、注释、处理指令或文本元素。
声明一个XML对象基本语法如下:
varxml:
XML=newXML(
使用newXML()创建XML对象,AS3声明XML对象比较灵活了,XML对象里的内容可以用引号也可以像上面的代码不使用引号。
更直接的声音方式直接赋值,只要XML结构是正确的就行,如下:
varxml=
trace(xml.toXMLString())
第8行,使用对象的toXMLString()方法输出xml,这个方法要和toString()区分开来,还有一个是输出XML文本结点的方法text(),我们先来区分一下这三个方法,便于我们后面的学习。
范例如下:
varxml:
XML=
text1
text2
trace(xml.text());//输出:
text1text2
trace(xml.text()[0]);//输出:
text1
trace(xml.text()[1]);//输出:
text2
trace(xml.child
(1).toXMLString());//输出:
trace(xml.child
(1).toString());//输出:
barText1
Ø
toXMLString()方法:
始终返回XML对象的开始标签、属性和结束标签的字符串型式。
toString()方法:
只是按字符串形式返回节点的内容。
text()方法:
则是返回XML文本节点的所有XML属性的XMLList对象,上面的例子,有两个文本节点text1和text2。
11.3.2XML节点访问
存取节点是使用XML对象的基础,要用好XML先要掌握管理XML类的方法,XML类提供了以下各管理节点的方法。
1.访问XML各节点。
在学习访问XML节点前,要先弄明白XML各层次的关系后面,要使用这个层级与节点编号来访问不同位置的节点。
虽然我们看来,“
我们把下面的代码分解如图11-12所示。
varxml:
XML=
图11-12用IE浏览XML文件
上图中,红色方块表示卷标,黑色方块表示文字元素。
XML中卷标和文字元素都算是一个节点。
XML结构如同一个二维表对横向和纵向进行编号,我们常要使用这个编号访问各节点。
在AS2里,我们常使用xmlObj.firstChild.childNodes[0]来访问节点。
AS3里我们有很多方法来访问不同位置的节点,首先介绍使用child()访问节点。
①child()方法(propertyName:
Object):
XMLList
使用child()方法列出其子项,一个XML子项就是一个XML元素、文本节点、注释或处理指令。
代码如下:
varxml:
XML=
trace(xml.child("bar").length());
//输出2
trace(xml.child("bar")[0].toXMLString());
//输出:
trace(xml.child("bar")[1].toXMLString());
//输出:
child()方法,可以直接使用子项目编号来读取,及child
(1)比如上面的xml对象,我们用xml.child("bar")[0]和xml.child
(1)输出结果是一样的。
如果用“*”号代替编号则表示输出所有节点,范例代码如下:
varxml:
XML=
trace(xml.child("bar")[0].toXMLString());
//输出:
trace(xml.child(0).toXMLString());
//输出:
trace(xml.child("*").toXMLString());
//输出:
②children()方法(propertyName:
Object):
XMLList
children()按照XML对象的显示顺序列出其子项。
一个XML子项就是一个XML元素、文本节点、注释或处理指令。
和child()方法不同,child只是读取单个子项的,而children()是读取所有的子项。
我们也可以按子项编号用children()来完成child()的工作,下面用个范例做个对比,如下:
varxml:
XML=
trace(xml.children());
//输出:
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,用节点名子访问,也可以使用“*”访问所有节点。
范例如下:
varxml:
XML=
trace(xml.elements("*"));//输出:
trace(xml.elements("*")[0].toXMLString());//输出:
trace(xml.elements("bar").length());//输出:
2
trace(xml.elements("bar")[1].toXMLString());//输出:
elements()看起来和children()一样,都是读取XML对象的所有子项。
这两个方法是有区别的,而且区别很大。
elements()只是读取XML对象的元素,如
对比范例如下:
XML.ignoreComments=false;//先设置不忽略注释才能用childern获取注释
XML.ignoreProcessingInstructions=false;//先设置不忽略XML指令
varmyxml:
XML=
dtext
--这是注释-->
一个指令?
>
;
trace(myxml.children().toXMLString());
/*输出所有子项:
dtext
--这是注释-->
一个指令?
>
*/
trace(myxml.elements("*").toXMLString());
//输出:
对比下第11行和第19行,两种方法输出的子项,现在可以很显视地区分这两个方法了。
④descendants()方法(name:
Object=*):
XMLList
descendants()是读取包含给定name参数的XML对象的所有后代(子级、孙级、曾孙级等)。
这和前面介绍的几个方法又有所不同了,前面介绍的child()、children()和elements()都只是读取所指点的那层的子项,而这个descendants()是读取其下面所有的层级子项,所用的参数和elements()是一样可以使用参数name,用节点名子访问,也可以使用“*”访问所有节点。
范例如下:
varxml:
XML=
text1
text2
trace(xml.descendants("b").toXMLString());//输出:
trace(xml.child("b").toXMLString());//输出:
对比下使用descendants()和child()读取节名b后的区别,child()只是从当前层读取节点b,descendants()则读取XML对象里所有节点名为b的节点,我们可以xml.descendants("b")[1]用编号去选取需要访问的结点,从而在不清楚XML对象里节点名为“b”的层次位置也能很好的访问。
⑤“.”dot(XML)运算符
这里,还可以使用点运算符来读取XML的结点,别看这个“小不点”点运算符在AS里的并不莫生,作用也大着。
AS2时代,我们使用点运算符来向影片剪辑的深层次访问变量,现在XML的层级关系里,一样可以灵活地运用点运算符来问了。
范例如下:
varxml:
XML=
&nbs,p;,;
trace(xml.bar);
//输出:
trace(xml.bar[1].toXMLString());
//输出:
第6行,使用点运算符,直接访问节点名则获得他所有的子项这和上面介绍的xml.children()作用一样,只是children可以在未知节点名的情况下获取所有子项,第8行则跟child
(1)的作用一样了。
⑥使用parent()访问上一级节点
在AS2里,访问上一个节点是使用parentNode,还有firstChild、lastChild、nextSibling等等,层级之间的访问方法比较多。
现在AS3的XML类对于层级之间的访问方法只留了个parent()其它的都被去了。
因为XML对象的访问很灵活了,在AS2时所用的很多方法都可以使用别的来替代了。
我们来看下parent的使用,第11行,声明对象,一个在xml结点上位置第三层的“
- 。
- 1
- 2
- 1
- 给node对象
//我们再用node.parent()看看他上一个节点是什么
trace(node.parent());
/*输出node的上一个节点所有子项
- 1
- 2
*/
⑦childIndex()方法
childIndex()方法不是用来读取节点的,是用来获取节点的位置,其父项上下文中从0开始编制索引的位置,范例如下:
varmyxml:
XML=
text1 trace(myxml.childIndex());//输出:
-1
trace(myxml.bar.childIndex());//输出:
0
trace(myxml.btxt.childIndex());//输出:
1
2.访问XML的属性
每个卷标都可以拥有一个以上的属性,这个属性可以像我们AS里的字符型变量一样存放一段字符串,访问属性XML对象提供了下面几个方法。
①attribute(attributeName:
*):
XMLList
使用attribute()读取与参数相符属性的值,如下:
varxml:
XML=
text1 trace(xml.attribute("theName"));//输出:
大男
trace(xml.attribute("*"));//输出:
大山男
trace(xml.attribute("*")[1]);//输出:
男
attribute()可以使用“*”号输出下面所有属性。
使用属性名读取时,属性名是区分大小写的,这和我们的变量规则一样。
如图没有这个属性则输出一个空值,不会报错。
②attributes(attributeName:
*):
XMLList
使用attributes()返回给定XML对象的属性值列表。
结合使用name()方法和attributes()方法可返回属性的名称。
和上面的attribute()方法有些不一样,上面那个方法是读取单个属性值。
而这个方法是读取属性值列表,所以使用xml.attribute(“*”)和xml.attributes()输出结果一样,都是获取所有属性,范例如下:
varxml:
XML=
trace(xml.attribute("*"));//输出:
20myphoto
trace(xml.attribute("*")[1]);//输出:
myphoto
trace(xml.attribute());//输出:
20myphoto
trace(xml.attribute().length());//输出:
2
trace(xml.attribute()[1]);//输出:
myphoto
③@运算符attributeidentifier运算符
@运算符可以像attribute()方法一样,取得属性值。
也可以结合“*”号来取得指定层下所有的节点值,代码如下:
varxml:
XML=
trace(xml.@id);//输出:
20
trace(xml.@*.length());//输出:
2
trace(xml.@*);//输出:
20myphoto
trace(xml.@*[1]);//输出:
myphoto
@运算符配合“*”获取所有属性时,不用加双引号。
我们可以很方便地使用@算符替代attribute(),下面我们再看看使用@向卷标里存入属性。
varxml:
XML=
xml.@newing="newphoto"//新创建一个属性newing
trace(xml.@*.length());//输出:
3
trace(xml.@*);//输出:
20myphotonewphoto
trace(xml.@*[2]);//输出:
newphoto
④name()
name()方法用来获取限定名称,限定名称也就是卷标名或者属性名。
name()可获取各节点或属性名,范例如下:
varmyxml:
XML=
text1 trace(myxml.name());//输出:
topxml
trace(myxml.child("*")[0].na,me());//输出:
bar
trace(myxml.child(0).attributes()[0].name());//输出:
va
3.XML节点管理
XML节点管理即节点的添加删除复制等管理。
①appendChild方法(child:
Object):
XML
将给定子项追加到该XML对象属性的末尾。
appendChild()方法可采用XML对象、XMLList对象或随后转换为String的任何其它数据类型。
范例如下:
varmyxml:
XML=
text1 myxml.appendChild(
text2 );trace(myxml.bar.toXMLString());//输出:
text1 trace(myxml.newbar.toXMLString());//输出:
text2 ②insertChildAfter()方法(child1:
Object,child2:
Object):
*
在该XML对象的child1参数后插入给定的child2参数并返回生成的对象。
如果child1参数为null,该方法将在XML对象的所有子项之前插入child2的内容(也就是说,不在任何子项之后)。
如果提供child1,但XML对象中不包含该参数,则不修改该XML对象并返回undefined。
如果对不是元素(文本、属性、注释、pi等等)的XML子项调用该方法,则返回undefined。
范例如下:
varmyxml:
XML=
text1 text2 ;
myxml.insertChildAfter(myxml.bar[0],
text1 );trace(myxml)
输出以后,新的XML节点被插入到中间,如下:
text1 text1 text2 ;
③insertChildBefore()方法(child1:
Object,child2:
Object):
*
和上面的insertChildAfter()方法的相似,这个方法是在对象的child1参数后面插入给定的child2参数并返回生成的对象。
如果提供child1,但XML对象中不包含该参数,则不修改该XML对象并返回undefined。
如果对不是元素(文本、属性、注释、pi等等)的XML子项调用该方法,则返回undefined。
范例如下:
varmyxml:
XML=
text1 text2 ;
myxml.insertChildBefore(myxml.bar[0],
text1 );trace(myxml)
输出以后,新的XML节点被插入到了第一个位置,如下:
text1 text1 text2 ;
④delete()运算符
delete()不是XML的方法,他是一个运算符。
XML没有提供删除节点的方法了,这个运算符完全可以满足我们的需求即删除指定的节点,使用delete可以删除节点也可以删除属性,范例如下。
varmyxml:
XML=
text1 text2 text3 ;
delete(myxml.bar[1]);//删除第二个节点
delete(myxml.bar[0].@va);//删除属性va
trace(myxml)
删除了节点和属性后输出如下:
text1 text3 ;
⑤norm
代码如下:
varxml:
XML=
child0
&n,bsp;
;
varnode:
XML=xml.child("p")[1].child("ul").child("li")[1];
//上面的,表示把
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Flash AS与XML数据交互 AS XML 数据 交互