as3读取xml

读取xml 所有节点,并读取节点属性值,返回xmlList对象

 

<root imageWidth='600' imageHeight='400' title="这是放标题的这是放标题的">         
         <menu frame="_parent" imageUrl="pics/1.jpg" title="客户案例" imageName="1、云南客商订购耙斗装岩机等大型矿用设备" /> <menu frame="_parent" imageUrl="pics/2.jpg" title="客户案例" imageName="2、矿建设备起运山西" /> <menu frame="_parent" imageUrl="pics/3.jpg" title="客户案例" imageName="3、新疆客商订购中煤产品" /> <menu frame="_parent" imageUrl="pics/4.jpg" title="客户案例" imageName="4、中煤集团一批矿用设备将发往四川和韩国" /> <menu frame="_parent" imageUrl="pics/5.jpg" title="客户案例" imageName="5、中煤集团一批矿用设备发往内蒙古" /> <menu frame="_parent" imageUrl="pics/6.jpg" title="客户案例" imageName="6、中煤集团一批耙装机即将发往山西晋城" /> <menu frame="_parent" imageUrl="pics/7.jpg" title="客户案例" imageName="7、中煤集团翻斗式矿车被电影《鬼吹灯之精绝古城》选为剧情道具" /> <menu frame="_parent" imageUrl="pics/8.jpg" title="客户案例" imageName="8、中煤集团一批矿用设备即将发往山西吕梁" /> <menu frame="_parent" imageUrl="pics/9.jpg" title="客户案例" imageName="9、河北张家口客商莅临中煤集团考察采购设备" /> <menu frame="_parent" imageUrl="pics/10.jpg" title="客户案例" imageName="10、中煤集团一批矿用设备即将发往山西临汾" />
</root>

  

读取所有的menu节点内容 并且返回menu对象

              var imageXmlList:XMLList = xml.menu;
			
			for (var i:int = 0; i <imageXmlList.length(); i++)
			{
				var imageVo:ImageVo = new ImageVo();
				imageVo.imageUrl = imageXmlList[i]. @imageUrl;
				imageVo.imageLink = imageXmlList[i]. @url;				
				imageVo.imageName = imageXmlList[i].@imageName;
				imageVoAry.push(imageVo);				
				trace("+++++"+imageXmlList[i].@title);
			}
			return imageXmlList;

  

 

2、如果xml文件,menu添加一个父节点products,那么写法改为:

var imageXmlList:XMLList = xml.products[0].menu;

其他依旧。

 

 

 

 

在as里面,我觉得最重要和最常用的内容莫过于读取xml数据了,这也是as最常用的和外界数据交互的内容,下面我想和大家一起来对as3读取xml内容进行一些探讨。 下面是本人知道的一些方法,拿出来做个引导,如有不对的,还希望大家能指出来
最常用的方法,按节点读取
xml代码
  1. <infoPic>
  2. <pic>
  3. <url>images/01.jpg</url>
  4. <content>1</content>
  5. </pic>
  6. <pic>
  7. <url>images/02.jpg</url>
  8. <content>2</content>
  9. </pic>
  10. </infoPic>

 

 

as3代码

  1. var url=new URLRequest("info.xml"); //获取一个xml文件
  2. var loadurl=new URLLoader(url); //使用URLLoader导入数据
  3. loadurl.addEventListener(Event.COMPLETE,Loadxml); //添加事件******,以在XML数据导入完成后处理XML数据
  1. function Loadxml(event:Event) {
  2. var xml:XML=XML(loadurl.data); //导入完成后,使用导入的数据创建XML对象
  3. trace(xml.child(0).child(0)); //输出xml对象的第一节点下第一个节点 ,输出结果:images/01.jpg
  4. }
这是最简单最常用的方法,要想读取xml里面的那个数据,就通过节点读取他,需要注意的是节点是从0开始计数的。

 

节点名读取法

上贴说了节点索引读取,那么我们再来看看节点名直接读取 方法也差不多,就改一句话
as3代码
  1. var url=new URLRequest("info.xml"); //获取一个xml文件
  2. var loadurl=new URLLoader(url);
  3. loadurl.addEventListener(Event.COMPLETE,Loadxml);
  4. function Loadxml(event:Event) {
  5. var xml:XML=XML(loadurl.data);
  6. trace(xml.pic[0].url[0]); //输出xml对象的第一个pic节点下第一个url节点 ,输出结果:images/01.jpg
  7. }
和上面的区别就只有最后输出部分,trace(xml.pic[0].url[0]);,这里需要注意的是,必须得层层读取,如果直接trace(xml.url[0]);就会输出undefined,无法找到你要的内容

 

 

 

 

 

 

节点属性读取

还有一种常用方法,就是节点属性读取法
xml代码:
  1. <infoPic>
  2. <pic>
  3. <url name='richie'>images/01.jpg</url>
  4. <content>1</content>
  5. </pic>
  6. <pic>
  7. <url name='dfive'>images/02.jpg</url>
  8. <content>2</content>
  9. </pic>
  10. </infoPic>

 

as3代码:
  1. var url=new URLRequest("info.xml");
  2. var loadurl=new URLLoader(url);
  3. loadurl.addEventListener(Event.COMPLETE,Loadxml);
  4. function Loadxml(event:Event) {
  5. var xml:XML=XML(loadurl.data);
  6. trace(xml.pic[0].url.@name);
  7. trace(xml.pic[1].url.@name);
  8. //输出结果:richie
  9. //输出结果:dfive
  10. }

 

as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式。

XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据。将数据加载到 XML 对象时,ActionScript 会分析数据并将其分层结构加载到内存(如果 XML 数据格式有误,它会发送运行时错误)。

利用 XML 和 XMLList 对象的运算符和方法可以轻松遍历 XML 数据的结构。

 

1、读取外部 XML 文档

可以使用 URLLoader 类从 URL 加载 XML 数据。若要在应用程序中使用以下代码,请将示例中的 XML_URL 值替换为有效的 URL:

var myXML:XML = new XML();
var XML_URL:String = "http://www.87cool.com/sitemap.xml";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", xmlLoaded);

function xmlLoaded(event:Event):void
{
myXML = XML(myLoader.data);
trace("Data loaded.");
}

 

2、使用点 (.) 运算符和后代存取器 (..) 运算符

使用点 (.) 运算符和后代存取器 (..) 运算符可以访问 XML 对象的子属性。参考下面的 XML 对象:

var myXML:XML =
< order>
< book ISBN="0942407296">
< title>Baking Extravagant Pastries with Kumquats</title>
< author>
< lastName>Contino</lastName>
< firstName>Chuck</firstName>
< /author>
< pageCount>238</pageCount>
< /book>
< book ISBN="0865436401">
< title>Emu Care and Breeding</title>
< editor>
< lastName>Case</lastName>
< firstName>Justin</firstName>
< /editor>
< pageCount>115</pageCount>
< /book>
< /order>对象 myXML.book 是一个 XMLList 对象,它包含名为 book 的 myXML 对象的子属性。它们是两个 XML 对象,与 myXML 对象的两个 book 属性匹配。

对象 myXML..lastName 是一个 XMLList 对象,该对象包含名为 lastName 的所有后代属性。它们是两个 XML 对象,与 myXML 对象的两个 lastName 匹配。

myXML.book.editor.lastName 对象是一个 XMLList 对象,它包含 myXML 对象的名为 book 的子对象的名为 editor 的子对象的名为 lastName 的所有子对象:在本例中,XMLList 对象只包含一个 XML 对象(值为 "Case" 的 lastName 属性)。

 


3、访问父节点和子节点

parent() 方法返回 XML 对象的父项。

可以使用子级列表的序数索引值访问特定的子对象。例如,假设 XML 对象 myXML 有两个名为 book 的子属性。每个名为 book 的子属性都有一个与之关联的索引编号:

myXML.book[0]
myXML.book[1]

要访问特定的孙项,可为子项和孙项名称同时指定索引编号:

myXML.book[0].title[0]

不过,如果 x.book[0] 只有一个子项名为 title ,则可以省略索引引用,如下所示:

myXML.book[0].title

同样,如果对象 x 只有一个 book 子对象,并且如果该子对象只有一个 title 对象,则可以同时省略两个索引引用,如下所示:

myXML.book.title

可以使用 child() 方法导航到名称基于变量或表达式的子项,如下面的示例所示:

var myXML:XML =
< order>
< book>
< title>Dictionary</title>
< /book>
< /order>;

var childName:String = "book";

trace(myXML.child(childName).title) // output: Dictionary


4、访问属性

使用 @ 符号(属性标识符运算符)可以访问 XML 或 XMLList 对象的属性,如下面的代码所示:

var employee:XML =
< employee id="6401" code="233">
< lastName>Wu</lastName>
< firstName>Erin</firstName>
< /employee>;
trace(employee.@id); // 6401

可以一起使用 * 通配符和 @ 符号来访问 XML 或 XMLList 对象的所有属性,如下面的代码所示:

var employee:XML =
< employee id="6401" code="233">
< lastName>Wu</lastName>
< firstName>Erin</firstName>
< /employee>;
trace(employee.@*.toXMLString());
// 6401
// 233

可以使用 attribute() 或 attributes() 方法访问 XML 或 XMLList 对象的特定属性或所有属性,如下面的代码所示:

var employee:XML =
< employee id="6401" code="233">
< lastName>Wu</lastName>
< firstName>Erin</firstName>
< /employee>;
trace(employee.attribute("id")); // 6401
trace(employee.attribute("*").toXMLString());
// 6401
// 233
trace(employee.attributes().toXMLString());
// 6401
// 233

请注意,还可以使用以下语法访问属性,如下面的示例所示:

employee.attribute("id")
employee["@id"]
employee.@["id"]其中每一个都等效于 employee.@id . 但是,语法 employee.@id 是首选方法。

 


5、按属性或元素值过滤

可以使用括号运算符 — ( 和 ) — 过滤具有特定元素名称或属性值的元素。请考虑下面的 XML 对象:

var x:XML =
< employeeList>
< employee id="347">
< lastName>Zmed</lastName>
< firstName>Sue</firstName>
< position>Data analyst</position>
< /employee>
< employee id="348">
< lastName>McGee</lastName>
< firstName>Chuck</firstName>
< position>Jr. data analyst</position>
< /employee>
< /employeeList>
以下表达式都是有效的:

x.employee.(lastName == "McGee") — 这是第二个 employee 节点。

x.employee.(lastName == "McGee").firstName — 这是第二个 employee 节点的 firstName 属性。

x.employee.(lastName == "McGee").@id — 这是第二个 employee 节点的 id 属性的值。

x.employee.(@id == 347) — 第一个 employee 节点。

x.employee.(@id == 347).lastName — 这是第一个 employee 节点的 lastName 属性。

x.employee.(@id > 300) — 这是具有两个 employee 属性的 XMLList。

x.employee.(position.toString().search("analyst") > -1) — 这是具有两个 position 属性的 XMLList。

 

如果试图按照可能不存在的属性或元素过滤,则 Flash? Player 和 Adobe? AIR? 将引发异常。例如,以下代码的最后一行产生一个错误,因为第二个 p 元素中没有 id 属性:

var doc:XML =
< body>
< p id='123'>Hello, <b>Bob</b>.</p>
< p>Hello.</p>
< /body>;
trace(doc.p.(@id == '123'));

同样,以下代码的最后一行也会产生一个错误,因为第二个 p 元素没有 b 属性:

var doc:XML =
< body>
< p id='123'>Hello, <b>Bob</b>.</p>
< p>Hello.</p>
< /body>;
trace(doc.p.(b == 'Bob'));

为了避免这些错误,可以使用 attribute() 和 elements() 方法来识别具有匹配属性或元素的属性,如下面的代码所示:

var doc:XML =
< body>
< p id='123'>Hello, <b>Bob</b>.</p>
< p>Hello.</p>
< /body>;
trace(doc.p.(attribute('id') == '123'));
trace(doc.p.(elements('b') == 'Bob'));

还可以使用 hasOwnProperty() 方法,如下面的代码所示:

var doc:XML =
< body>
< p id='123'>Hello, <b>Bob</b>.</p>
< p>Hello.</p>
< /body>;
trace(doc.p.(hasOwnProperty('@id') && @id == '123'));
trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));

6、使用 for..in 和 for each..in 语句

ActionScript 3.0 包含 for..in 语句和 for each..in 语句,用于遍历 XMLList 对象。例如,我们来看 XML 对象 myXML 和 XMLList 对象 myXML.item 。XMLList 对象 myXML.item 由 XML 对象的两个 item 节点组成。

var myXML:XML =
< order>
< item id='1' quantity='2'>
< menuName>burger</menuName>
< price>3.95</price>
< /item>
< item id='2' quantity='2'>
< menuName>fries</menuName>
< price>1.45</price>
< /item>
< /order>;

for..in 语句用于遍历 XMLList 中的一组属性名称:

var total:Number = 0;
for (var pname:String in myXML.item)
{
total += myXML.item.@quantity[pname] * myXML.item.price[pname];
}

for each..in 语句用于遍历 XMLList 中的属性:

var total2:Number = 0;
for each (var prop:XML in myXML.item)
{
total2 += prop.@quantity * prop.price;
}

一些注意事项

 
 

补充下我觉得需要注意的地方 编码问题:对于一些xml文件使用GBK编码,as默认是使用的utf-8编码,所以可能会出现乱码现象,这时不要担心,你只要在代码里面加上System.useCodePage=true;,就不会出现乱码了
关于节点索引,如果你清楚知道子节点只有一个,可以省掉节点名的索引值(注意使用child的时候不能省掉索引值)
posted @ 2014-05-22 14:37  regalys168  阅读(690)  评论(0编辑  收藏  举报