XML 是一种结构化的描述数据形式,因其简单,灵活,尤其是在数据交换和可移植等优点现
已成为事实上的工业标准。
ActionScript 3.0 新增了新的操作XML的语法,即ECMAScript for XML,也叫E4X,提供一种比
Document Object Model (DOM)更简单更容易访问XML的新方式。使用E4X,你会发现操作XML
比以前更简单了
ActionScript 3.0 包含一些用于处理 XML 结构化信息的类。下面列出了两个主类:
■ XML:表示单个 XML 元素,它可以是包含多个子元素的 XML 文档,也可以是文档中
的单值元素。
■ XMLList:表示一组 XML 元素。当具有多个“同级”(在 XML 文档分层结构中的相
同级别,并且包含在相同父级中)的 XML 元素时,将使用 XMLList 对象。例如,
XMLList 实例是使用以下一组 XML 元素(可能包含在 XML 文档中)的最简便方法:
<artist type="composer">Fred Wilson</artist>
<artist type="conductor">James Schmidt</artist>
<artist type="soloist">Susan Harriet Thurndon</artist>
技术名词:
XML document :
包含XML的文件,也指读取和发送XML的数据,XML文档的概念不要和XMLDocument类搞混。
XML包 :
一个XML包指从整个XML文档中取出的片断
XML 节点e :
XML最基本的块,节点可以是元素,文本节点,属性等等
XML 元素 :
这个术语和"Tag"意义类似,更确切地说,元素包含tags。元素必须有开始和结束标签
(<element></element>)或(<element />).
Root 节点 :
XML层级元素中最顶层的元素
Text 节点 :
包含文本的节点,一般都在元素里面
Attribute(属性):
元素的一部分,如<element name="value">,name="value"就是属性.
XML 声明 :
典型的申明如<?xml version="1.0" ?>.
XML 树 :
XML 数据的节点层级构成XML 树
可以通过{}创建动态xml
添加XML元素:
a:通过newElement属性来添加新的元素
- var example:XML = <example />;
- example.newElement = <newElement />;
-
- /* 显示:
- <example>
- <newElement/>
- </example>
- */
var example:XML = <example />;
example.newElement = <newElement />;
/* 显示:
<example>
<newElement/>
</example>
*/
b:用(.)运算符
- var example:XML = <example />;
- example.emptyElement = "";
-
- /* 显示:
- <example>
- <emptyElement/>
- </example>
- */
var example:XML = <example />;
example.emptyElement = "";
/* 显示:
<example>
<emptyElement/>
</example>
*/
c:用([ 和])
- var example:XML = <example />;
- var id:int = 10;
- example[ "user" + id ] = "";
-
- /* 显示:
- <example>
- <user10/>
- </example>
- */
var example:XML = <example />;
var id:int = 10;
example[ "user" + id ] = "";
/* 显示:
<example>
<user10/>
</example>
*/
上述三种职能插入到尾部,可用insertChildBefore( )和insertChildAfter( ) 方法来控制插入的位置
- var example:XML = <example/>;
- example.two = "";
- example = example.insertChildBefore( example.two, <one /> );
- example = example.insertChildAfter( example.two, <three /> );
-
- /* 显示:
- <example>
- <one/>
- <two/>
- <three/>
- </example>
- */
var example:XML = <example/>;
example.two = "";
example = example.insertChildBefore( example.two, <one /> );
example = example.insertChildAfter( example.two, <three /> );
/* 显示:
<example>
<one/>
<two/>
<three/>
</example>
*/
在XML元素中添加属性 : 使用E4X的@ 操作符
- var example:XML = <example><someElement/></example>;
- example.someElement.@number = 12.1;
- example.someElement.@string = "example";
- example.someElement.@boolean = true;
- example.someElement.@array = ["a", null, 7, undefined, "c"];
-
- /* 显示:
- <example>
- <someElement number="12.1" string="example" boolean="true"
- array="a,,7,,c"/>
- </example>
- */
var example:XML = <example><someElement/></example>;
example.someElement.@number = 12.1;
example.someElement.@string = "example";
example.someElement.@boolean = true;
example.someElement.@array = ["a", null, 7, undefined, "c"];
/* 显示:
<example>
<someElement number="12.1" string="example" boolean="true"
array="a,,7,,c"/>
</example>
*/
但是有时如果属性名包含一些特殊符号,则不能用@操作符,必须加上[]操作符
example.someElement.@["bad-variable-name"] = "yes";
在[]里还可用表达式产生动态属性名,这是种很实用的技巧:
example.someElement.@["color" + num] = "red";
读取XML树中的元素 :
使用elements( ) 方法返回XMLList 类型的所有元素,并用for each 循环遍历
- var menu:XML = <menu>
- <menuitem label="File">
- <menuitem label="New"/>
- </menuitem>
- <menuitem label="Help">
- <menuitem label="About"/>
- </menuitem>
- This is a text node
- </menu>;
-
- for each ( var element:XML in menu.elements( ) ) {
- /* 显示:
- File
- Help
- */
- trace( element.@label );
- }
var menu:XML = <menu>
<menuitem label="File">
<menuitem label="New"/>
</menuitem>
<menuitem label="Help">
<menuitem label="About"/>
</menuitem>
This is a text node
</menu>;
for each ( var element:XML in menu.elements( ) ) {
/* 显示:
File
Help
*/
trace( element.@label );
}
elements( ) 方法只返回下一级的子元素节点,这里面不包括文本节点和下一级节点.要向访问整个XML结构,还需进行递归循环处理
- var menu:XML = <menu>
- <menuitem label="File">
- <menuitem label="New"/>
- </menuitem>
- <menuitem label="Help">
- <menuitem label="About"/>
- </menuitem>
- This is a text node
- </menu>;
-
- /* 显示:
- File
- New
- Help
- About
- */
-
- walk( menu );
-
-
- function walk( node:XML ):void {
- for each ( var element:XML in node.elements( ) ) {
- trace( element.@label );
- // Recursively walk the child element to reach its children
- walk( element );
- }
- }
var menu:XML = <menu>
<menuitem label="File">
<menuitem label="New"/>
</menuitem>
<menuitem label="Help">
<menuitem label="About"/>
</menuitem>
This is a text node
</menu>;
/* 显示:
File
New
Help
About
*/
walk( menu );
function walk( node:XML ):void {
for each ( var element:XML in node.elements( ) ) {
trace( element.@label );
// Recursively walk the child element to reach its children
walk( element );
}
}
通过节点名字来查找元素 : 直接使用E4X 的. 加上属性名语法来查找元素
var fruit:XML = <fruit><name>Apple</name></fruit>;
trace( fruit.name );// 显示: Apple
var author:XML = <author><name><firstName>Darron</firstName></name></author>;
trace( author.name.firstName );// 显示: Darron
还有种简便的方法,即使用双点操作符(..)来跳过一级访问,如:
var author:XML = <author><name><firstName>Darron</firstName></name></author>;
trace( author..firstName );// 显示: Darron
当有多个元素节点具有相同名称时,可通过索引值访问,这有点像数组,使用中括号
- var items:XML = <items>
- <item>
- <name>Apple</name>
- <color>red</color>
- </item>
- <item>
- <name>Orange</name>
- <color>orange</color>
- </item>
- </items>;
-
- trace( items.item[0].name );// 显示: Apple
- trace( items.item[1].name );// 显示: Orange
var items:XML = <items>
<item>
<name>Apple</name>
<color>red</color>
</item>
<item>
<name>Orange</name>
<color>orange</color>
</item>
</items>;
trace( items.item[0].name );// 显示: Apple
trace( items.item[1].name );// 显示: Orange
元素节点,但又不知道有多少个,可用for each 循环遍历
- var items:XML = <items>
- <item>
- <name>Apple</name>
- <color>red</color>
- </item>
- <item>
- <name>Orange</name>
- <color>orange</color>
- </item>
- </items>;
-
- // 使用双点操作符
- for each ( var name:XML in items..name ) {
- /* 显示:
- Apple
- Orange
- */
- trace( name );
- }
var items:XML = <items>
<item>
<name>Apple</name>
<color>red</color>
</item>
<item>
<name>Orange</name>
<color>orange</color>
</item>
</items>;
// 使用双点操作符
for each ( var name:XML in items..name ) {
/* 显示:
Apple
Orange
*/
trace( name );
}
也可用[]操作符来访问:
var nodeName:String = "color";
var fruit:XML = <fruit><color>red</color></fruit>;
trace( fruit[nodeName] );// Displays: red
需要注意的是[]操作符不能和双点操作符一起用
trace( fruit..[nodeName] ); // 导致编译错误
text( ) 方法可正确返回文本节点内容:
- var fruit:XML = <fruit>
- <name>Apple</name>
- An apple a day...
- </fruit>;
-
- for each ( var textNode:XML in fruit.text( ) ) {
- trace( textNode );// 显示: An apple a day...
- }
var fruit:XML = <fruit>
<name>Apple</name>
An apple a day...
</fruit>;
for each ( var textNode:XML in fruit.text( ) ) {
trace( textNode );// 显示: An apple a day...
}
读取元素的属性 :
使用attributes( ) 方法返回指定元素的属性列表,或者通过名称用E4X的@操作符或attribute( )
- var fruit:XML = <fruit name="Apple" color="red" />;
- var attributes:XMLList = fruit.attributes( );
-
- trace( attributes[0] );// 显示: Apple
- trace( attributes[1] );// 显示: red
var fruit:XML = <fruit name="Apple" color="red" />;
var attributes:XMLList = fruit.attributes( );
trace( attributes[0] );// 显示: Apple
trace( attributes[1] );// 显示: red
name( ) 方法可显示出属性名
- var fruit:XML = <fruit name="Apple" color="red" />;
- for each ( var attribute:XML in fruit.attributes( ) ) {
- trace( attribute.name( ) + " = " + attribute.toString( ) );
-
- /* 显示:
- name = Apple
- color = red
- */
- }
var fruit:XML = <fruit name="Apple" color="red" />;
for each ( var attribute:XML in fruit.attributes( ) ) {
trace( attribute.name( ) + " = " + attribute.toString( ) );
/* 显示:
name = Apple
color = red
*/
}
如果属性名含有特殊字符,可用[]进行访问
使用delete 关键字删除元素,文本节点和属性 ;delete只能一次删除一个节点,如果要删除多个节点,可通过for循环进行删除