准备:
首先你得有台电脑.其次是要装上Windows系统和Flash8.
XML基础:
既然是处理XML文档.就要先来了解下XML文档.下面是我所了解的,有些是在Flash中用不到的.
XML扩展标记语言(Extensible Markup Language)是SGML(Structured Generalized Markup Language)的子集.
XML是由World Wide Web Consortium(W3C)的XML工作组定义的.
下面开始了解XML的结构.
XML是由序言和文档元素组成的.
序言包括:
1.声明(declaration),文档的第一行,它说明这是一个XML文档. [可选]
2.注释,增强文档的可读性. [可选]
3.文档类型声明(document type declaration),XML文档类型定义必须在XML声明之后,文档元素之前,中间可以插入XML处理指令,它说明文档的类型和结构. [可选]
4.处理指令(processing instruction),在XML声明之后,处理XML信息的指令. [可选]
注:文档类型声明(document type declaration)需要用到xml词汇表.如果想了解详细信息请访问http://www.w3c.org.
文档元素:
元素说明了文档的逻辑结构,元素包函起始标签,元素内容,元素属性和结束标签.一个xml文档必须有一个顶层元素,所有的元素都嵌套在这个顶层元素中.文档元素名,属性名全部都是自定义的.
说明:
先看代码:
[Copy to clipboard] [ - ]
CODE:
<?
xml
version
=
"
1.0
"
encoding
=
"
gb2312
"
standalone
=
"
yes
"
?>
<!--
xml
注释-->
<!
DOCTYPE
ChooseFlash
>
<!--<!
DOCTYPE
类型
SYSTEM
"
一个dtd文件的地址
"
&
gt
;没有地址或地址错误都会出错,
SYSTEM
一个关键字-->
<?
xml
-
stylesheet
type
=
"
text/css
"
href
=
"
处理xml文档信息的css.css
"
?>
<元素>
<子元素 属性=
"
子元素
"
>信息<
/
子元素>
<
/
元素>
上面是一个加了文档类型声明,处理指令的简单xml文档.下面一一解释.
[Copy to clipboard] [ - ]
CODE:
<?xml version=”1.0″ encoding=”gb2312″?>
这句是xml的声明信息.version是版本号,encoding是字符编码,如果有中文就需要用gb2312编码,standalone属性可以取yes和no,属性值yes,说明文档没有外部声明.属性值no,说明文档有外部声明.
[Copy to clipboard] [ - ]
CODE:
<!–xml注释–>
这句是xml的注释.
[Copy to clipboard] [ - ]
CODE:
<!DOCTYPE ChooseFlash>
这句是文档类型声明,DOCTYPE标记是声明类型用的.ChooseFlash是类型.这里的类型是指xml中的词汇表.
[Copy to clipboard] [ - ]
CODE:
<?xml-stylesheet type=”text/css” href=”处理xml文档信息的css.css”?>
这句是处理指令,xml-stylesheet是一个处理指令,type是类型,href是地址.这个处理指令把CSS链接到XML文档.跟html中应用css差不多一样.
[Copy to clipboard] [ - ]
CODE:
<元素>
<子元素 属性=”子元素”>信息</子元素>
</元素>
这个是文档元素(Flash用节点表示).<元素>是顶层元素,<子元素>是嵌套在顶层元素中的元素,”属性”是一个属性,”信息”是字符串.
也可以这样写: <子元素 属性=”子元素” 信息=”信息” />
如果用了文档类型声明,顶层元素命名最好跟声明的类型一至.否则会出错(要有词汇表时,像这个ChooseFlash这不会出错,因为没有这个词汇表.)
下面是一个完整xml文档.
[Copy to clipboard] [ - ]
CODE:
<?xml version=”1.0″ encoding=”gb2312″?>
<!–firstNode是一个顶层元素–>
<firstNode>
<!–childNode是一个嵌套在顶层元素firstNode中的子级元素,有一个nodeName的属性–>
<childNode nodeName=”childNode”>childNode</childNode>
</firstNode>
好,xml方面就到这里.–如果有错,请指教.如果想了解详细信息的请访问http://www.w3c.org.
下面就是怎么在Flash中调用XML文档和处理XML中的数据.
Flash方面:
在Flash中调用xml文档需要用到XML类和XMLNode类中的一些方法和属性.这里我们就不需要用到那么多.
把用到的方法和属性列出来:
XML类:
XML.ignoreWhite;//处理xml文档中的空白,设为true时,忽略空白,默认值为false.
XML.load(”xml文档的地址”);//加载指定的xml文档.
XML.onLoad=function(success:Boolean){};//成功加载了xml文档时调用.
XML构造函数.
XMLNode类:
XMLNode.attributes;//用来指定xml文档的属性.
XMLNode.childNodes;//返回指定xml文档对象的子级的数组.
XMLNode.firstChild;//引用父级节点的子级列表中的第一个子级.
XMLNode.nodeValue;//返回XML对象的节点值.
XMLNode.nodeName;//XML 对象的节点名称
开始实验:
首先说明:
在xml声明处加上encoding=”gb2312″.使用gb2312编码.;
Flash中如果有中文需要在加载代码前面加上System.useCodepage = true;
使用系统编码.防止乱码.
实验1:
一个简单的实验.把xml文档中的节点在Flash输出来.
新建一个xml文档.在记事本输入下面的代码.保存为 xml-001.xml ;
[Copy to clipboard] [ - ]
CODE:
&
lt
;?
xml
version
=
"
1.0
"
?&
gt
;
&
lt
;!--
xml
-
001
.
xml
--&
gt
;
&
lt
;
firstNode
name
=
"
1
"
&
gt
;
&
lt
;
childNode
name
=
"
1.1
"
/
>
<childNode name="1.2"
/
&
gt
;
&
lt
;
childNode
name
=
"
1.3
"
/
>
<
/
firstNode
&
gt
;
上面是一个简单的xml文档.结构是一个顶层节点中嵌套三个子级节点.现在在Flash中如何读出来呢?来看操作:
打开Flash,新建一个Flash文档,保存到刚才的xml文档中的目录中,命名 xml-001.fla ;
在第一帧输入下面代码:
[Copy to clipboard] [ - ]
CODE:
//xml-001.fla.
//实例化一个xml对象.
var
myxml
:
XML
=
new
XML
()
;
//分析时忽略xml文档中的空格.
myxml
.
ignoreWhite
=
true
;
//加载xml-001.xml文档.
myxml
.
load
(
"
xml-001.xml
"
)
;
//调用XML.onLoad事件.
myxml
.
onLoad
=
function
(
success
:
Boolean
)
{
//如果加载成功,success=true;否则success=false;
if
(
success
)
{
trace
(
"
加载成功!
"
)
;
//输出顶层节点的节点名和顶层节点中属性name的值.
trace
(
myxml
.
firstChild
.
nodeName
+
"
:
"
+
myxml
.
firstChild
.
attributes
.
name
)
;
//用一个数组来引用顶层节点中子级节点的数组.
var
child_arr
:
Array
=
myxml
.
firstChild
.
childNodes
;
//用嵌套for语句遍历出xml文档中的所有数据.
//这个for遍历的是顶层节点下的子级节点.
for
(
var
i
=
0
;
i
&
lt
;
child_arr
.
length
;
i
++
)
{
//输出顶层节点下的子级节点的节点名和顶层节点下的子级节点中属性name的值.
trace
(
child_arr
[
i
]
.
nodeName
+
"
:
"
+
child_arr
[
i
]
.
attributes
.
name
)
;
}
}
else
{
trace
(
"
加载失败!
"
)
;
}
}
;
实验2:
现在做的是把一个多层嵌套节点的xml文档在Flash中输出来.
新建一个xml文档.在记事本中输入下面的代码.然后保存为 xml-002.xml
[Copy to clipboard] [ - ]
CODE:
&
lt
;?
xml
version
=
"
1.0
"
?&
gt
;
&
lt
;!--
xml
-
002
.
xml
--&
gt
;
&
lt
;
firstNode
name
=
"
1
"
&
gt
;
&
lt
;
childNode
name
=
"
1.1
"
&
gt
;
&
lt
;
Node
name
=
"
1.1.1
"
/
>
<Node name="1.1.2"
/
&
gt
;
&
lt
;
Node
name
=
"
1.1.3
"
/
>
<
/
childNode
&
gt
;
&
lt
;
childNode
name
=
"
1.2
"
&
gt
;
&
lt
;
Node
name
=
"
1.2.1
"
/
>
<Node name="1.2.2"
/
&
gt
;
&
lt
;
Node
name
=
"
1.2.3
"
/
>
<
/
childNode
&
gt
;
&
lt
;
childNode
name
=
"
1.3
"
&
gt
;
&
lt
;
Node
name
=
"
1.3.1
"
/
>
<Node name="1.3.2"
/
&
gt
;
&
lt
;
Node
name
=
"
1.3.3
"
/
>
<
/
childNode
&
gt
;
&
lt
;
/
firstNode>
上面是一个多层嵌套节点的xml文档.结构是一个顶层节点中,嵌套3个子级节点,3个子级节点分别嵌套3个子级节点.现在又应该怎样在Flash中读出来呢?其实原理跟上面一样.在for中嵌套一个for就可以了.
打开Flash新建一个Flash文档,保存到刚才的xml文档的目录中,命名为 xml-02.fla
在第一帧中输入以下代码:
[Copy to clipboard] [ - ]
CODE:
//xml-002.fla.
//实例化一个xml对象.
var
myxml
:
XML
=
new
XML
()
;
//分析时忽略xml文档中的空格.
myxml
.
ignoreWhite
=
true
;
//加载xml-002.xml文档.
myxml
.
load
(
"
xml-002.xml
"
)
;
//调用XML.onLoad事件.
myxml
.
onLoad
=
function
(
success
:
Boolean
)
{
//如果加载成功,success=true;否则success=false;
if
(
success
)
{
trace
(
"
加载成功!
"
)
;
//输出顶层节点的节点名和顶层节点中属性name的值.
trace
(
myxml
.
firstChild
.
nodeName
+
"
:
"
+
myxml
.
firstChild
.
attributes
.
name
)
;
//用一个数组来引用顶层节点中子级节点的数组.
var
child_arr
:
Array
=
myxml
.
firstChild
.
childNodes
;
//用嵌套for语句遍历出xml文档中的所有数据.
//这个for遍历的是顶层节点下的子级节点.
for
(
var
i
=
0
;
i
&
lt
;
child_arr
.
length
;
i
++
)
{
//输出顶层节点下的子级节点的节点名和顶层节点下的子级节点中属性name的值.
trace
(
child_arr
[
i
]
.
nodeName
+
"
:
"
+
child_arr
[
i
]
.
attributes
.
name
)
;
//这个for遍历的是顶层节点下的子级节点下的子级节点.
for
(
var
j
=
0
;
j
&
lt
;
child_arr
[
i
]
.
childNodes
.
length
;
j
++
)
{
//输出顶层节点下的子级节点下的子级节点的节点名 和 顶层节点下的子级节点下的子级节点中属性name的值.不要晕.看看输出面板就会明白它们之间的关系了哦.
trace
(
child_arr
[
i
]
.
childNodes
[
j
]
.
nodeName
+
"
:
"
+
child_arr
[
i
]
.
childNodes
[
j
]
.
attributes
.
name
)
;
}
}
}
else
{
trace
(
"
加载失败!
"
)
;
}
}
;
实验3:
利用xml文档数据做用户登录.
新建一个xml文档.在记事本中输入下面的代码.然后保存为 xml-003.xml
[Copy to clipboard] [ - ]
CODE:
&
lt
;?
xml
version
=
"
1.0
"
encoding
=
"
gb2312
"
?&
gt
;
&
lt
;!--
xml
-
003
.
xml
--&
gt
;
&
lt
;
UserDataList
&
gt
;
&
lt
;
manager
Post
=
"
经理
"
&
gt
;
&
lt
;
UserData
username
=
"
MChooseFlash01
"
password
=
"
MChooseHappiness
"
/
>
<UserData username="MChooseFlash02" password="MChooseHappiness"
/
&
gt
;
&
lt
;
/
manager>
<Employee Post="职员">
<UserData username="EChooseFlash01" password="EChooseHappiness"
/
&
gt
;
&
lt
;
UserData
username
=
"
EChooseFlash02
"
password
=
"
EChooseHappiness
"
/
>
<
/
Employee
&
gt
;
&
lt
;
/
UserDataList>
首先分析下结构.
<UserDataList>是顶层节点.
<manager Post=”经理”>是顶层节点下的子级节点.Post是manager节点的属性.
<Employee Post=”职员”>是顶层节点下的子级节点.Post是Employee节点的属性.
<UserData username=”MChooseFlash01″ password=”MChooseHappiness” /> 是顶层节点下的子级节点下的子级节点.username和password是UserData节点的属性.
这次也需要用到嵌套for.
打开Flash新建一个Flash文档,大小为300*100,保存到刚才的xml文档的目录中,命名为 xml-03.fla
新建3个图层分别命名Actions , cont , bg .
bg层在第一帧画三个文本框大小的虚线框.
cont层在第一帧拉二个输入文本框,实例名分别为username_txt和password_txt,在拉一个动态文本框,实例名为 status_txt.将这三个文本框对齐须虚线框.再点窗口->公用库->按钮.拉一个按钮出来.实例名为login_btn.
Actions层在第一帧中输入以下代码:
[Copy to clipboard] [ - ]
CODE:
//xml-003.fla.
//使用系统编码.防止乱码.
System
.
useCodepage
=
true
;
//实例化一个xml对象.
var
myxml
:
XML
=
new
XML
()
;
//分析时忽略xml文档中的空格.
myxml
.
ignoreWhite
=
true
;
//加载xml-002.xml文档.
myxml
.
load
(
"
xml-003.xml
"
)
;
//调用XML.onLoad事件.
myxml
.
onLoad
=
function
(
success
:
Boolean
)
{
//如果加载成功,success=true;否则success=false;
if
(
success
)
{
trace
(
"
加载成功!
"
)
;
login_btn
.
onRelease
=
function
()
{
//用一个数组来引用顶层节点中子级节点的数组.
var
child_arr
:
Array
=
myxml
.
firstChild
.
childNodes
;
//用UserData指定xml文档节点的attributes对象.
var
UserData
:
Object
;
//这个for遍历的是顶层节点下的子级节点.
for
(
var
i
=
0
;
i
&
lt
;
child_arr
.
length
;
i
++
)
{
//这个for遍历的是顶层节点下的子级节点下的子级节点.
for
(
var
j
=
0
;
j
&
lt
;
child_arr
[
i
]
.
childNodes
.
length
;
j
++
)
{
//用UserData指定child_arr[i].childNodes[j].attributes对象
UserData
=
child_arr
[
i
]
.
childNodes
[
j
]
.
attributes
;
//判断用户名和密码.
//这里的UserData.username其实就是child_arr[i].childNodes[j].attributes.username的简写.UserData.password同理.
//username和password是xml文档节点中的属性.因为xml和Flash区分大小写.所以在输入时要注意大小写.
if
((
username_txt
.
text
==
UserData
.
username
)
&
amp
;
amp
;&
amp
;
amp
;
(
password_txt
.
text
==
UserData
.
password
))
{
//Post这个是顶层节点下子级节点的Post属性.
status_txt
.
text
=
child_arr
[
i
]
.
attributes
.
Post
+
"
:
"
+
UserData
.
username
+
"
登录成功
"
;
//如果用户名和密码正确就退出for.这个重要.如果不用这个,就会一直重复判断用户名和密码.直到将xml文档节点遍历完.那样就不是我们想要的.所以一有正确的就退出for;
return
;
}
else
{
status_txt
.
text
=
"
用户名或密码错误
"
;
}
}
}
}
;
}
else
{
trace
(
"
加载失败!
"
)
;
}
}
;
实例4:
利用List组件做个mp3播放列表.
新建一个xml文档.在记事本中输入下面的代码.然后保存为 xml-004.xml
[Copy to clipboard] [ - ]
CODE:
&
lt
;?
xml
version
=
"
1.0
"
encoding
=
"
gb2312
"
?&
gt
;
&
lt
;
mp3List
&
gt
;
&
lt
;
mp3
path
=
"
jmzcg.mp3
"
&
gt
;啊桑-寂寞在唱歌&
lt
;
/
mp3>
<mp3 path="jmjywsls.mp3">寂寞是因为思念谁<
/
mp3
&
gt
;
&
lt
;
mp3
path
=
"
szwspdxd.mp3
"
&
gt
;老狼-睡在我上铺的兄弟&
lt
;
/
mp3>
<mp3 path="qf.mp3">誓言-求佛<
/
mp3
&
gt
;
&
lt
;
mp3
path
=
"
xyzth.mp3
"
&
gt
;下一站天后&
lt
;
/
mp3>
<mp3 path="nswdxfm.mp3">伊能静-你是我的幸福吗<
/
mp3
&
gt
;
&
lt
;
mp3
path
=
"
aqfx.mp3
"
&
gt
;爱情复兴
(
容祖儿
)
&
lt
;
/
mp3>
<mp3 path="qrlg.mp3">水木年华-秋日恋歌<
/
mp3
&
gt
;
&
lt
;
mp3
path
=
"
qnyh.mp3
"
&
gt
;张国荣-倩女幽魂&
lt
;
/
mp3>
<mp3 path="a.mp3">一首很棒的英文歌(酒吧里常放)<
/
mp3
&
gt
;
&
lt
;
/
mp3List>
xml结构:
<mp3List>xml文档中的顶层节点.
<mp3 path="jmzcg.mp3">啊桑-寂寞在唱歌<
/
mp3
&
gt
;顶层节点下的子级节点.
path
是
mp3
节点下的属性.
"
啊桑-寂寞在唱歌
"
是
mp3
的节点值.
打开
Flash
新建一个
Flash
文档,大小为
200
*
150
,保存到刚才的
xml
文档的目录中,命名为
xml
-
04
.
fla
新建
2
个图层分别命名
Actions
,
cont
.
cont
层中拉一个
List
组件到第一帧.大小为
200
*
150
,实例名为
mp3_list
.
Actions
层第一帧输入下面代码:
[
Copy
to
clipboard
]
[
-
]
CODE
:
//xml-004.fla.
//使用系统编码.防止乱码.
System
.
useCodepage
=
true
;
//实例化一个xml对象.
var
myxml
:
XML
=
new
XML
()
;
//分析时忽略xml文档中的空格.
myxml
.
ignoreWhite
=
true
;
//加载xml-004.xml文档.
myxml
.
load
(
"
xml-004.xml
"
)
;
//调用XML.onLoad事件.
myxml
.
onLoad
=
function
(
success
:
Boolean
)
{
//如果加载成功,success=true;否则success=false;
if
(
success
)
{
trace
(
"
加载成功!
"
)
;
//用一个数组来引用顶层节点中子级节点的数组.
var
child_arr
:
Array
=
myxml
.
firstChild
.
childNodes
;
//这个for遍历的是顶层节点下的子级节点.
for
(
var
i
=
0
;
i
&
lt
;
child_arr
.
length
;
i
++
)
{
//将歌曲添加到List组件中.
//child_arr[i].firstChild.nodeValue这个是xml节点的节点值.
//child_arr[i].attributes.path这个是xml节点下的path属性.
mp3_list
.
addItem
({
label
:
(
i
+
1
)
+
"
.
"
+
child_arr
[
i
]
.
firstChild
.
nodeValue
,
data
:
child_arr
[
i
]
.
attributes
.
path
})
;
}
}
else
{
trace
(
"
加载失败!
"
)
;
}
}
;
//listEvent函数是执行List组件中change事件
function
listEvent
()
:
Void
{
//这个就是歌曲地址.用Sound类的loadSound方法就可以播放歌曲了.例:mysound.loadSound(mp3_list.selectedItem.data);详细请看帮助文档.
trace
(
mp3_list
.
selectedItem
.
data
)
;
}
//添加帧听器.
mp3_list
.
addEventListener
(
"
change
"
,
listEvent
)
;