下面就是怎么在Flash中調(diào)用XML文檔和處理XML中的數(shù)據(jù).
Flash方面:
在Flash中調(diào)用xml文檔需要用到XML類和XMLNode類中的一些方法和屬性.這里我們就不需要用到那么多.把用到的方法和屬性列出來:
XML類:
XMLNode類:
開始實驗:
首先說明:
在xml聲明處加上encoding="gb2312".使用gb2312編碼.;
Flash中假如有中文需要在加載代碼前面加上System.useCodepage = true;
使用系統(tǒng)編碼.防止亂碼.
實驗1:
一個簡單的實驗.把xml文檔中的節(jié)點在Flash輸出來.
新建一個xml文檔.在記事本輸入下面的代碼.保存為 xml-001.xml ;
<?xml version="1.0"?>
<!--xml-001.xml-->
<firstNode name="1">
<childNode name="1.1" />
<childNode name="1.2" />
<childNode name="1.3" />
</firstNode>
上面是一個簡單的xml文檔.結(jié)構(gòu)是一個頂層節(jié)點中嵌套三個子級節(jié)點.現(xiàn)在在Flash中如何讀出來呢?
來看操作:
打開Flash,新建一個Flash文檔,保存到剛才的xml文檔中的目錄中,命名 xml-001.fla ;
在第一幀輸入下面代碼:
//xml-001.fla.
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-001.xml文檔.
myxml.load("xml-001.xml");
//調(diào)用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
//輸出頂層節(jié)點的節(jié)點名和頂層節(jié)點中屬性name的值.
trace(myxml.firstChild.nodeName ":" myxml.firstChild.attributes.name);
//用一個數(shù)組來引用頂層節(jié)點中子級節(jié)點的數(shù)組.
var child_arr:Array = myxml.firstChild.childNodes;
//用嵌套for語句遍歷出xml文檔中的所有數(shù)據(jù).
//這個for遍歷的是頂層節(jié)點下的子級節(jié)點.
for (var i = 0; i<child_arr.length; i ) {
//輸出頂層節(jié)點下的子級節(jié)點的節(jié)點名和頂層節(jié)點下的子級節(jié)點中屬性name的值.
trace(child_arr[i].nodeName ":" child_arr[i].attributes.name);
}
} else {
trace("加載失敗!");
}
};
實驗2:
現(xiàn)在做的是把一個多層嵌套節(jié)點的xml文檔在Flash中輸出來.
新建一個xml文檔.在記事本中輸入下面的代碼.然后保存為 xml-002.xml
<?xml version="1.0"?>
<!--xml-002.xml-->
<firstNode name="1">
<childNode name="1.1">
<Node name="1.1.1" />
<Node name="1.1.2" />
<Node name="1.1.3" />
</childNode>
<childNode name="1.2">
<Node name="1.2.1" />
<Node name="1.2.2" />
<Node name="1.2.3" />
</childNode>
<childNode name="1.3">
<Node name="1.3.1" />
<Node name="1.3.2" />
<Node name="1.3.3" />
</childNode>
</firstNode>
上面是一個多層嵌套節(jié)點的xml文檔.結(jié)構(gòu)是一個頂層節(jié)點中,嵌套3個子級節(jié)點,3個子級節(jié)點分別嵌套3個子級節(jié)點.現(xiàn)在又應(yīng)該怎樣在Flash中讀出來呢?其實原理跟上面一樣.在for中嵌套一個for就可以了.
打開Flash新建一個Flash文檔,保存到剛才的xml文檔的目錄中,命名為 xml-02.fla
在第一幀中輸入以下代碼:
//xml-002.fla.
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-002.xml文檔.
myxml.load("xml-002.xml");
//調(diào)用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
//輸出頂層節(jié)點的節(jié)點名和頂層節(jié)點中屬性name的值.
trace(myxml.firstChild.nodeName ":" myxml.firstChild.attributes.name);
//用一個數(shù)組來引用頂層節(jié)點中子級節(jié)點的數(shù)組.
var child_arr:Array = myxml.firstChild.childNodes;
//用嵌套for語句遍歷出xml文檔中的所有數(shù)據(jù).
//這個for遍歷的是頂層節(jié)點下的子級節(jié)點.
for (var i = 0; i<child_arr.length; i ) {
//輸出頂層節(jié)點下的子級節(jié)點的節(jié)點名和頂層節(jié)點下的子級節(jié)點中屬性name的值.
trace(child_arr[i].nodeName ":" child_arr[i].attributes.name);
//這個for遍歷的是頂層節(jié)點下的子級節(jié)點下的子級節(jié)點.
for (var j = 0; j<child_arr[i].childNodes.length; j ) {
//輸出頂層節(jié)點下的子級節(jié)點下的子級節(jié)點的節(jié)點名 和 頂層節(jié)點下的子級節(jié)點下的子級節(jié)點中屬性name的值.不要暈.看看輸出面板就會明白它們之間的關(guān)系了哦.
trace(child_arr[i].childNodes[j].nodeName ":" child_arr[i].childNodes[j].attributes.name);
}
}
} else {
trace("加載失敗!");
}
};
實驗3:
利用xml文檔數(shù)據(jù)做用戶登錄.
新建一個xml文檔.在記事本中輸入下面的代碼.然后保存為 xml-003.xml
<?xml version="1.0" encoding="gb2312"?>
<!--xml-003.xml-->
<UserDataList>
<manager Post="經(jīng)理">
<UserData username="MChooseFlash01" password="MChooseHappiness" />
<UserData username="MChooseFlash02" password="MChooseHappiness" />
</manager>
<Employee Post="職員">
<UserData username="EChooseFlash01" password="EChooseHappiness" />
<UserData username="EChooseFlash02" password="EChooseHappiness" />
</Employee>
</UserDataList>
首先分析下結(jié)構(gòu):
<UserDataList>是頂層節(jié)點.
<manager Post="經(jīng)理">是頂層節(jié)點下的子級節(jié)點.Post是manager節(jié)點的屬性.
<Employee Post="職員">是頂層節(jié)點下的子級節(jié)點.Post是Employee節(jié)點的屬性.
<UserData username="MChooseFlash01" password="MChooseHappiness" /> 是頂層節(jié)點下的子級節(jié)點下的子級節(jié)點.username和password是UserData節(jié)點的屬性.
這次也需要用到嵌套for.
如圖:
Actions層在第一幀中輸入以下代碼:
//xml-003.fla.
//使用系統(tǒng)編碼.防止亂碼.
System.useCodepage = true;
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-002.xml文檔.
myxml.load("xml-003.xml");
//調(diào)用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
login_btn.onRelease = function()
{
//用一個數(shù)組來引用頂層節(jié)點中子級節(jié)點的數(shù)組.
var child_arr:Array = myxml.firstChild.childNodes;
//用UserData指定xml文檔節(jié)點的attributes對象.
var UserData:Object;
//這個for遍歷的是頂層節(jié)點下的子級節(jié)點.
for (var i = 0; i<child_arr.length; i ) {
//這個for遍歷的是頂層節(jié)點下的子級節(jié)點下的子級節(jié)點.
for (var j = 0; j<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文檔節(jié)點中的屬性.因為xml和Flash區(qū)分大小寫.所以在輸入時要注重大小寫.
if ((username_txt.text == UserData.username) && (password_txt.text == UserData.password)) {
//Post這個是頂層節(jié)點下子級節(jié)點的Post屬性.
status_txt.text = child_arr[i].attributes.Post ":" UserData.username "登錄成功";
//假如用戶名和密碼正確就退出for.這個重要.假如不用這個,就會一直重復(fù)判定用戶名和密碼.直到將xml文檔節(jié)點遍歷完.那樣就不是我們想要的.所以一有正確的就退出for;
return;
} else {
status_txt.text = "用戶名或密碼錯誤";
}
}
}
};
} else {
trace("加載失敗!");
}
};
實例4:
利用List組件做個mp3播放列表.
新建一個xml文檔.在記事本中輸入下面的代碼.然后保存為 xml-004.xml
<?xml version="1.0" encoding="gb2312"?>
<mp3List>
<mp3 path="jmzcg.mp3">啊桑-寂寞在唱歌</mp3>
<mp3 path="jmjywsls.mp3">寂寞是因為思念誰</mp3>
<mp3 path="szwspdxd.mp3">老狼-睡在我上鋪的兄弟</mp3>
<mp3 path="qf.mp3">誓言-求佛</mp3>
<mp3 path="xyzth.mp3">下一站天后</mp3>
<mp3 path="nswdxfm.mp3">伊能靜-你是我的幸福嗎</mp3>
<mp3 path="aqfx.mp3">愛情復(fù)興(容祖兒)</mp3>
<mp3 path="qrlg.mp3">水木年華-秋日戀歌</mp3>
<mp3 path="qnyh.mp3">張國榮-倩女幽魂</mp3>
<mp3 path="a.mp3">皇綴馨艫撓⑽母?酒吧里常放)</mp3>
</mp3List>
xml結(jié)構(gòu):
<mp3List>xml文檔中的頂層節(jié)點.
<mp3 path="jmzcg.mp3">啊桑-寂寞在唱歌</mp3>頂層節(jié)點下的子級節(jié)點.path是mp3節(jié)點下的屬性."啊桑-寂寞在唱歌"是mp3的節(jié)點值.
//xml-004.fla.
//使用系統(tǒng)編碼.防止亂碼.
System.useCodepage = true;
//實例化一個xml對象.
var myxml:XML = new XML();
//分析時忽略xml文檔中的空格.
myxml.ignoreWhite = true;
//加載xml-004.xml文檔.
myxml.load("xml-004.xml");
//調(diào)用XML.onLoad事件.
myxml.onLoad = function(success:Boolean)
{
//假如加載成功,success=true;否則success=false;
if (success) {
trace("加載成功!");
//用一個數(shù)組來引用頂層節(jié)點中子級節(jié)點的數(shù)組.
var child_arr:Array = myxml.firstChild.childNodes;
//這個for遍歷的是頂層節(jié)點下的子級節(jié)點.
for (var i = 0; i<child_arr.length; i ) {
//將歌曲添加到List組件中.
//child_arr[i].firstChild.nodeValue這個是xml節(jié)點的節(jié)點值.
//child_arr[i].attributes.path這個是xml節(jié)點下的path屬性.
mp3_list.addItem({label:(i 1) "." child_arr[i].firstChild.nodeValue, data:child_arr[i].attributes.path});
}
} else {
trace("加載失敗!");
}
};
//listEvent函數(shù)是執(zhí)行List組件中change事件
function listEvent():Void
{
//這個就是歌曲地址.用Sound類的loadSound方法就可以播放歌曲了.例:mysound.loadSound(mp3_list.selectedItem.data);具體請看幫助文檔.
trace(mp3_list.selectedItem.data);
}
//添加幀聽器.
mp3_list.addEventListener("change", listEvent);