`

AS3处理XML(转)

 
阅读更多

转自:http://blog.csdn.net/zdingxin/article/details/6635325

初始化XML对象 
XML对象可以代表一个XML元素、属性、注释、处理指令或文本元素。在ActionScript 3.0中我们可以直接将XML数据赋值给变量:
var myXML:XML =
   <order>
       <item id='1'>
           <menuName>burger</menuName>
           <price>3.95</price>
       </item>
       <item id='2'>
           <menuName>fries</menuName>
           <price>1.45</price>
       </item>
   </order>
你也可以使用new 构造器来从XML数据文本创建一个XML对象实例:
var myXML:XML = new XML("<order><item id='1'><menuName>burger</menuName><price>3.95</price></item></order>")
如果XML数据不是格式完好的(如少了结束标签),那么将会出现运行时错误。
注意,你也可以将变量实例传入XML数据中:
var tagname:String = "item";
var attributename:String = "id";
var attributevalue:String = 5;
var content:String = "Chicken";
var x:XML = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>;
trace (x.toXMLString())
// Output: <item id="5">Chicken</item>

加载XML
通常,我们的应用是从外部源导入XML数据,如web service或RSS feed,以下是一个从远程URL导入XML数据的例子:
var myXML:XML = new XML();
var XML_URL:String = "
http://www.example.com/Sample3.xml";
//创建URLRequest。
var myXMLURL:URLRequest = new URLRequest(XML_URL);
//使用URLLoader导入数据。
var myLoader:URLLoader = new URLLoader(myXMLURL);
//添加事件监听器,以在XML数据导入完成后处理XML数据。
myLoader.addEventListener("complete", xmlLoaded);
//导入完成后,创建使用导入的数据创建XML对象
function xmlLoaded(evtObj:Event) {
       var myXML:XML = XML(myLoader.data);
       trace("Data loaded.");
}

也可以直接读取本地XML
var fileStream:FileStream=new FileStream();
fileStream.open(new File("c:\111.xml"), FileMode.READ);
var contentXml:XML=new XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
fileStream.close();

使用.和@:用于访问属性:

//获取第1个item的menuName值
trace(myXML.item[0].menuName); // Output: burger
//获取第1个item的id属性值
trace(myXML.item[0].@id);//Output:1
//获取id属性为2的item的menuName值
trace(myXML.item.(@id==2).menuName); // Output: fries
//获取menuName为burger的item的price值
trace(myXML.item.(menuName=="burger").price); // Output: 3.95
你也可以使用appendChild()方法给XML添加新的子节点:
var newItem:XML =
   <item id="3">
       <menuName>medium cola</menuName>
       <price>1.25</price>
   </item>
myXML.appendChild(newItem);

当然你也可以使用@和.操作符来更新数据:
myXML.item[0].menuName="regular burger";
myXML.item[1].menuName="small fries";
myXML.item[2].menuName="medium cola";
myXML.item.(menuName=="regular burger").@quantity = "2";
myXML.item.(menuName=="small fries").@quantity = "2";
myXML.item.(menuName=="medium cola").@quantity = "2";

访问XML数据

你可以使用.(点号)和..操作符访问XML对象的子节点,使用@操作符访问某一节点的属性。考虑以下XML对象: 
var x:XML =
      <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>


对象x.book表示一个包含所有名称为book的子节点的XMLList对象,该XMLList包含两个XML对象(两个book节点)。

对象x..lastName表示一个包含XML树结构下部所有的lastName属性的XMLList对象,该XMList包含两个XML对象(两个LastName属性)。

对象x.book.editor.lastName表示一个包含所有x对象的所有名称为book的子节点的所有名称为editor的子节点的所有lastName节点的XMLList对象,该XMLList只包含一个XML对象(值为"Case"的lastName属性)。

访问父节点和子节点 
parent()方法返回XML对象的父节点。
你可以使用子节点列表的顺序索引值来访问特定的子节点,例如,假定某一XML对象x有两个名称为book的子节点,你可以如下访问它们:
//第1个book节点
x.book[0]
//第2个book节点
x.book[1]
要访问孙子节点,我们可以如下直接使用儿子和孙子节点的索引值来访问:
x.book[0].title[0]
不过如果x.book[0]只有一个名称为title的子节点的话,那么可以省略索引:
x.book[0].title
类似的,如果x对象只有一个book子节点,并且该book节点的子节点对象只有一个title对象,那么两个索引值都可以省略:
x.book.title
注意,你也可以使用child()方法,直接使用名称访问特定的子节点:
var x.XML =
       <order>
           <book>
               <title>Dictionary</title>
           </book>
       </order>

var childName:String = "book";
trace (x.child(childName).title) // Output: Dictionary
访问属性 
我们使用使用@操作符访问XMLNode属性:
var myXML:XML =
   <order>
       <item id='1'>
           <menuName>burger</menuName>
           <price>3.95</price>
       </item>
       <item id='2'>
           <menuName>fries</menuName>
           <price>1.45</price>
       </item>
   </order>

//获取第1个item的id属性值
trace(myXML.item[0].@id);//Output:1
使用属性或元素值过滤XML数据 
我们可以使用特定的元素名称和属性值来定位到特定的元素考虑以下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>

以下是正确的访问方法:
//lastName为“McGee”的employee对象,第1个employee节点
x.employee.(lastName == "McGee") // The first employee node
//lastName为“McGee”的employee对象的firstName节点,第1个employee节点的节点
x.employee.(lastName == "McGee").firstName // The firstName property of that node
//lastName为“McGee”的id属性
x.employee.(lastName == "McGee").@id // The value of the id attribute
//所有id属性值为347的employee对象列表
x.employee.(@id == 347)
//id属性值为347的employee对象的lastName子节点
x.employee.(@id == 347).lastName
//所有id属性值大于347的employee对象列表
x.employee.(@id > 300) // An XML list with both employee properties
//所有position子节点值包含“analyst”的employee对象列表
x.employee.(position.toString().search("analyst") > -1)

使用for ... in和for each ... in 语句 
ActionScript 3.0 包括了一个新用来遍历XMLList对象的的for ... in语句和for each ... in语句。例如,考虑以下XML对象,myXML和myXML..item XMLList对象(包含两个item XML对象节点的XML列表):
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 += Number(
myXML.item.@quantity[pname]) * Number(myXML.item.price[pname]);
}


for each ... in语句遍历XMLList的所有节点:


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


使用with语句 
我们可以使用with语句,来指明后续的属性和节点值都是基于某一XML对象,前面的for each ... in示例代码,使用with语句的代码如下:
var total:Number = 0;
for each (var item in myXML..item)
{
   with (item)
    {
         //{内的属性和节点对象都是基于item XML对象的,所有不需要使用item.来访问。
         total += Number(@quantity) * Number(price);
     }

}
trace(total);
修改XML对象 
我们可以使用prependChild()方法或者appendChild()方法在XML对象的子节点列表的前面或者最后面添加节点:
var x1:XML = <p>Paragraph 1</p>
var x2:XML = <p>Paragraph 2</p>
var x:XML = <body></body>
x = x.appendChild(x1);
x = x.appendChild(x2);
x = x.prependChild(<p>Paragraph 0</p>);
// x == <body><p>Paragraph 0</p><p>Paragraph 1</p><p>Paragraph 2</p></body>

使用insertChildBefore()方法或者insertChildAfter()方法在特定的节点前面活着回后面添加节点:
var x:XML =
   <body>
       <p>Paragraph 1</p> 
       <p>Paragraph 2</p>
   </body>

var newNode:XML = <p>Paragraph 1.5</p>
x = x.insertChildAfter(x.p[0], newNode)
x = x.insertChildBefore(x.p[2], <p>Paragraph 1.75</p>)


注意,我们也可以在构造XML对象的时候使用大括号({和})来引用变量:
var ids:Array = [121, 122, 123];
var names:Array = [["Murphy","Pat"],["Thibaut","Jean"], ["Smith","Vijay"]]
var x:XML = new XML("<employeeList></employeeList>");
for (var i:int = 0; i < 3; i++) {
          var newnode:XML = new XML(); 
           newnode =
               <employee id={ids[i]}>
                   <last>{names[i][0]}</last>
                   <first>{names[i][1]}</first>
               </employee>

           x = x.appendChild(newnode)

}
我们也可以使用=操作符来给XML对象节点赋值:
var x:XML =
   <employee>
       <lastname>Smith</lastname>
   </employee>

x.firstname = "Jean";
x.@id = "239";
以上代码将把XML对象X设置成如下:
<employee id="239">
   <lastname>Smith</lastname>
   <firstname>Jean</firstname>
   </employee>
我们也可以使用+和+=操作符来连结XMLList:
var x1:XML = <a>test1</a>
var x2:XML = <b>test2</b>
var xList:XMLList = x1 + x2;
xList += <c>test3</c>
删除XML对象

E4X规范中定义有delete和deleteByIndex方法用来删除特定的XML节点,但是在当前版本的ActionScript 3.0实现中,并没有实现这两个方法,所有我们不能直接使用这两个方法,不过我们可以使用遍历XML树,剔除特定的节点,重新构造新的XML对象的方法来删除某一特定节点,以下我们将删除employee的lastname子节点:
private function deleteByIndex(xmlNode:XML,index:Number):XML{
    var newStr:String='';
    newStr+='<'+xmlNode.localName();
    for each (var att:XML in xmlNode.attributes()){
        newStr+=' '+att.localName()+'="'+att.toString()+'"';
    }
    newStr+='>';
    var i:Number=0;
    for each(var node:XML in xmlNode.children()){
        if(i!=index)
            newStr+=node.toXMLString();
        i++;
    }
    newStr+='</'+xmlNode.localName()+'/>';
    return new XML(newStr);
}

var myXML:XML=
   <employee id="239">
           <lastname>Smith</lastname>
           <firstname>Jean</firstname>
           <address>
            <city>shangrao</city>
            <load>daihu</load>
            <no>5</no>
           </address>
       </employee>

myXML=deleteByIndex(myXML,0);
以上的deleteByIndex函数有两个参数,第1的参数是被删除节点的父节点,第2的参数是被删除节点的在父节点的子节点列表中索引值。先遍历父节点的索引属性,然后遍历其所有的子节点,跳过我们要删除的节点,然后将它们组合成新的XML对象返回。
如果XML对象非常复杂,数据量必较大的话,以上删除节点的实现方法效率是非常好低,所有正确的选择还是使用E4X定义的删除方法,不过这个功能要等到ActionScript 3.0的下一个测试版本才能够实现。
XML类型转换 
我们可以将XML对象和XMLList对象转换为字符串,同样的,我们也可以将字符串转换为XML对象和XMLList对象。顺便,请记住所有的XML属性值、名称和文本值都是字符串。
转换XML和XMLList对象为字符串 
XML对象和XMLList对象都有有两个成员方法:toString()和toXMLString()方法。toXMLString()方法返回包含所有标签、属性、命名空间声明和XML对象内容的字符串,对与复杂的XML对象(包含有子元素),toString()方法的效果和toXMLString()方法的效果一样,但是对与简单的XML对象(只包含一个文本元素),toString()方法只返回元素的文本内容:
var myXML:XML =
  <order>
       <item id='1' quantity='2'>
           <menuName>burger</menuName>
           <price>3.95</price>
       </item>
   <order>

trace(myXML.item0.menuName.toXMLString())
// Output: <menuName>burger</menuName>
trace(myXML.item0.menuName.toString())
// Output: burger

将文本字符串转换为XML对象
我们可以使用new构造方法从字符串创建一个XML对象
var x:XML = new XML('<a>test<b>');
但是如果我们试图将一个非XML或者结构不完整的字符串转换为XML对象,那么将会报运行时错误:
var x:XML = new XML('<a>test'); // Throws an error

分享到:
评论

相关推荐

    AS3 操作XML

    ### AS3操作XML知识点解析 #### 一、ActionScript 3.0与XML的基本概念 在深入了解本示例代码之前,我们首先需要了解ActionScript 3.0(简称AS3)以及XML的基本概念。 - **ActionScript 3.0**:AS3是一种面向对象...

    as3加载xml实例

    在这个“as3加载xml实例”中,我们将深入探讨如何使用AS3来加载XML文件,并将其中的数据用于显示文本和创建链接。 XML(Extensible Markup Language)是一种轻量级的、可扩展的标记语言,常用于存储和传输数据。在...

    Flashas3读写XML

    AS3提供了强大的XML处理能力,使得开发者能够轻松地读取、解析和操作XML文档。本文将深入探讨如何在AS3中使用Flash来读取和写入XML。 首先,让我们了解XML的基本概念。XML(Extensible Markup Language)是一种自...

    as3反射和将XML转换成对象的类

    在AS3中,XML是一种常见的数据交换格式,XML转换类可以帮助解析XML文档,并根据其结构创建相应的AS3对象。这个过程通常涉及到递归遍历XML节点,为每个节点创建对应的属性或子对象,对于XML属性则映射到对象的属性值...

    as3+xml下拉菜单

    在本文中,我们将深入探讨如何使用ActionScript 3 (AS3) 和 XML 来创建一个灵活的下拉菜单。ActionScript 3 是Adobe Flash Professional和Flash Builder中的编程语言,而XML则是一种轻量级的数据交换格式,常用于...

    AS3加载并处理XML

    ### AS3加载并处理XML知识点详解 #### 一、引言 随着互联网技术的发展与进步,数据交换变得越来越频繁,而XML(可扩展标记语言)作为一种标准的数据交换格式,在多种场景下得到了广泛应用。Adobe Flash ...

    as 3.0读取XML

    在实际应用中,可能还需要处理XML加载失败的情况,例如添加`Event.ERROR`事件监听器进行错误处理。此外,XML数据可能需要进一步处理,如转换为对象、过滤或排序,这取决于具体的应用需求。了解这些基础操作后,你...

    AS2 加载XML播放器

    在本文中,我们将深入探讨如何使用AS2创建一个XML加载的播放器,以及实现这一功能的关键知识点。 首先,理解XML的用途至关重要。XML(eXtensible Markup Language)是一种结构化数据格式,常用于存储和传输信息。在...

    as3+xml相册源码

    AS3 + XML 相册源码是一个基于Adobe Flash ActionScript 3.0和XML技术实现的数字相册应用。ActionScript 3.0是Flash Professional中的编程语言,用于创建交互式内容,而XML则是一种轻量级的数据交换格式,常用于存储...

    AS3 XML加载图片、倒计时和各种数据

    在ActionScript 3.0(AS3)中,XML是一种常用的数据交换格式,它轻量级、易于理解和处理。在给定的标题“AS3 XML加载图片、倒计时和各种数据”中,我们可以理解为这是一个AS3项目,它利用XML文件来存储图片的路径、...

    AS3+XML相册例子

    8. **脚本文件**:`Scripts`文件夹可能包含了额外的AS3脚本文件,用于处理XML解析、事件监听、图片加载等逻辑。 9. **交互设计**:用户可以通过点击或滚动浏览相册,这涉及到AS3中的事件监听和处理,如MouseClick和...

    xml文件处理程序

    本主题主要关注如何处理XML文件,包括对其进行增、删、改、查操作,并手动创建树形结构以生成XML文件。 一、XML文件的基本结构 XML文件由一系列的元素构成,每个元素都有开始标签和结束标签,如 `&lt;element&gt;` 和 `...

    as3.0 XML加载

    本篇文章将深入探讨AS3.0中的XML加载过程,包括基本概念、加载方法、解析和处理数据以及一些实用技巧。 首先,让我们了解XML的基本结构。XML(Extensible Markup Language)是一种标记语言,用来存储和传输数据。它...

    AS3中新的XML处理方法.pdf

    这标志着AS3在处理XML数据方面迈出了重要的一步,它不仅简化了开发流程,而且提高了代码的可读性和维护性。 #### E4X背景 以往,ECMA脚本语言规范并没有提供专门用于处理XML数据的类或方法。ActionScript早期版本...

    AS3+XML+flash cs3 网站源码

    该资源是一个基于AS3(ActionScript 3)和XML的Flash CS3网站源码,用于构建动态且数据驱动的交互式网页。以下是这个项目中涉及的关键...这对于初学者理解AS3编程、XML数据处理以及Flash网页开发是一个很好的学习资源。

    将assess数据库转换成xml文件

    在ASP.NET开发环境中,有时我们需要将数据库中的数据转换为XML文件,以便于数据交换、存储或简化处理。本文将详细讲解如何将一个名为"assess"的数据库转换为XML文件,主要关注使用C#编程语言和ASP.NET框架来实现这一...

    as 实现读取xml文件并分页

    在AS(ActionScript)编程中,处理XML文件是一项常见的任务,尤其在开发Flex或Flash项目时。本示例探讨了如何使用AS实现读取XML文件并进行分页显示,这对于处理大量数据时优化用户界面体验至关重要。下面我们将详细...

    as3.0用xml调用图片相册

    3. **解析XML**:一旦XML数据可用,我们可以通过访问XML节点来获取图片信息。例如,如果XML结构如下: ```xml 图片1"/&gt; 图片2"/&gt; &lt;!-- 更多图片... --&gt; ``` 我们可以遍历`image`节点来获取每个图片的URL和...

    flash as3.0 + xml 经典flv视频播放

    在本文中,我们将深入探讨如何使用Flash AS3.0与XML技术实现经典的FLV视频播放器。这个项目涉及的关键知识点包括ActionScript 3.0编程、XML数据解析以及FLV视频格式的处理。 首先,ActionScript 3.0是Adobe Flash ...

Global site tag (gtag.js) - Google Analytics