`

[转]flex操作XML,强力总结帖

 
阅读更多

 

http://qiqishou.iteye.com/blog/585908

初始化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数据,如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."); 
}


E4X包含一些直观的方法XML数据的操作符(如.和@:用于访问属性): 
//获取第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

分享到:
评论
1 楼 cloud21 2011-08-16  
话说,有事没事过来看看你转的帖子。有收获呢。

相关推荐

    flex解析xml框架实例

    在Flex界面中添加HTTPService组件,配置其URL以指向服务器上的XML数据源,然后设置result事件监听器,以便在接收到数据时执行解析操作。 例如,以下是一个简单的HTTPService使用示例: ```xml &lt;![CDATA[ import...

    flex 操作XML

    综上所述,Flex中的XML操作涉及文件系统访问、网络通信、数据解析等多个方面,熟练掌握这些技能对于构建Flex应用至关重要。在实际项目中,根据具体需求灵活运用这些知识点,可以实现高效的数据管理和交换。

    FLEX操作XML&JSON

    【标题】: 使用FLEX操作XML和JSON 【概述】 在本文中,我们将探讨如何在Adobe Flex(现称为OpenFL)环境中处理XML和JSON数据。Flex是一种开源框架,允许开发人员使用ActionScript 3.0(AS3)和MXML来构建富互联网...

    flex解析xml

    总结,Flex解析XML文件主要通过XML和XMLList类,它们提供了丰富的API来操作XML数据。理解这些概念和方法,将有助于你在Flex应用中有效地处理和展示XML数据。无论是简单的数据展示还是复杂的交互逻辑,Flex都能通过...

    readxml flex加载xml文件

    本篇文章将深入探讨在Flex中读取XML文件的三种主要方法,并对它们进行比较。 一、XMLLoader XMLLoader是ActionScript 3中的一个类,专门用于加载和解析XML文档。使用XMLLoader,可以异步加载XML,这意味着主程序...

    Flex与JSON及XML的互操作

    ### Flex与JSON及XML的互操作:深度解析 #### 核心知识点概览 1. **Flex框架**:一种开源框架,允许开发者使用MXML语言和ActionScript 3构建Flash应用程序,尤其适用于创建富互联网应用(RIA)。 2. **JSON...

    Flex里解析XML数据

    总结,Flex提供了丰富的API和特性来处理XML数据,包括XML类、E4X语法、XMLList以及各种加载和解析工具。理解并熟练运用这些技术,能帮助开发者更好地在Flex应用中实现数据的交互和展示。在实际开发中,结合源码分析...

    flex 操作xml 实现增删改查

    ### Flex操作XML实现增删改查 在Flex中操作XML数据是进行动态内容处理的关键技能之一。本篇文章将深入探讨如何使用Flex中的XML类来实现对XML数据的增、删、改、查功能。 #### 一、理解XML结构 XML(可扩展标记...

    flex - xml操作

    ### Flex与XML操作详解 #### 一、E4X与ActionScript 3.0的集成 E4X(ECMAScript for XML)是ECMAScript标准的一个扩展,它被引入到ActionScript 3.0中,极大地简化了XML数据处理的过程。在Flash 5时,ActionScript...

    Flex:ArrayCollection转xml形式的实例

    另一方面,如果从服务器接收XML数据,也可以通过反向操作将XML转换为ArrayCollection,以便在Flex或Flash应用中使用。 在实际项目中,你可能还需要考虑更多细节,如XML的命名空间管理、属性的添加以及错误处理等。...

    flex 解析xml文件 httpservice

    在Flex开发中,XML文件常被用作数据存储和传输的格式,因为它结构清晰、易于理解和操作。本篇文章将深入探讨如何使用Flex解析XML文件,并通过HTTPService来读取XML内容,以及如何根据需求过滤字符串并获取所需值。 ...

    flex 读XML 写XML 并保存为文件

    总结,Flex中对XML的操作包括读取、写入和保存,可以结合E4X和FileReference类实现。同时,通过序列化和反序列化技术,可以将图形数据与XML文件进行交互,方便数据的持久化和复用。在实际项目中,这些技能对于构建富...

    Flex操作XML

    本篇文章将深入探讨如何在Flex中操作XML,以及如何利用DataSet展示XML数据。 XML(Extensible Markup Language)是一种结构化数据格式,适用于存储和传输数据。在Flex中,XML可以作为数据源,与UI组件进行交互,...

    flex 解析xml实例

    在Flex中,我们通常使用XML类来解析和操作XML文档。以下是一些关键步骤和知识点: 1. **创建XML对象**:在Flex中,你可以通过XML()构造函数创建一个XML对象,然后加载XML字符串或文件。例如: ```actionscript ...

    flex读取xml乱码的解决方法

    在探讨“Flex读取XML乱码的解决方法”这一主题时,我们首先需要理解几个关键概念:Flex框架、XML文件以及编码问题。Flex是一种用于构建跨平台桌面应用程序和移动应用程序的强大框架,它由Adobe Systems开发并开源。...

    Flex操作XML实现增删改查.pdf

    以下我们将深入探讨如何在Flex中操作XML。 一、XML基础知识 1. **元素(Element)**:XML文档的基本组成单位,由开始标签和结束标签包围的部分。例如 `&lt;node&gt;` 和 `&lt;/node&gt;`。 2. **节点(Node)**:包括元素、文本...

    flex解析xml文件

    在本文中,我们将深入探讨如何使用Flex来解析XML文件,并将其内容用作ComboBox下拉列表的数据源。首先,让我们理解Flex的基本概念。Flex是Adobe开发的一种开放源代码的富互联网应用程序(RIA)框架,用于构建和部署...

    Flex之URLLoader加载XML

    在Flex开发中,`URLLoader` 是一个非常重要的类,用于加载远程数据,如XML、JSON等。在本示例中,它被用来从服务器获取XML文件并将其内容解析为XML对象,以便在应用程序中使用。`Flex` 是Adobe开发的一个开放源代码...

    Flex Demo XML JSON

    在Flex中,我们可以使用XML和JSON来传输、解析和操作数据。 1. **XML处理**:Flex提供了一套完整的XML处理库,包括XML类和XMLList类。通过这些类,开发者可以方便地创建、解析和操作XML文档。例如,你可以使用`new ...

    Flex操作XML实现增删改查[借鉴].pdf

    本文主要讲解如何使用Flex操作XML实现增删改查的基本操作。 首先,理解XML的基本概念是至关重要的。XML(Extensible Markup Language)是一种标记语言,它允许我们定义自定义的标签来结构化数据。在XML文档中: 1....

Global site tag (gtag.js) - Google Analytics