zoukankan      html  css  js  c++  java
  • ActionScript 3操作XML 详解

    AS3引入了E4X ,它是根据ECMAScript标准处理XML 数据的全新机制。这使得程序员在程序中无缝地操作XML。在AS3中可以使用XML字面值将XML数据直接写入代码,该字面值将被自动解析。

    一、AS3中的XML入门

    1.可以将XML直接写入代码

         

    复制代码
    public var employeelist:XML=<employeelist>
                       <employee>
                           <name first="Conan" last="O'Brien" />
                           <title>Host</title>
                       </employee>
                       <employee>
                           <name first="Andy" last="Richter" />
                           <title>SideKick</title>
                       </employee>
                   </employeelist>;
    复制代码

    2.在字面值中使用as3的表达式:可以将ActionScript代码直接嵌入到XML数据中,方法时将希望添加的代码包围在大括号{}中,这样便可以使用动态生成的值填充数据集合。

    复制代码
        var efname:String="A";
                  var elname:int=1;
                  var etitle:String="+";
                  var employeelist:XML=<employeelist>
                      <employee>
                          <name first={efname} last={elname} />
                          <title>{etitle}</title>
                      </employee>
                  </employeelist>;
                  trace(employeelist.toXMLString());
    复制代码

    二、理解XML类

     每个类都表示不同的数据类型,可以在操作XML数据时使用它们。它们都位于ActionScript API 的顶层,不需要import 语句便可以使用它们。

      XML:XML对象表示一块简单的XML数据,如元素、文本节点、注释或处理指令。将所有这些不同的节点定义为XML对象,可以对它们使用操作XML数据的方法,而不必担心它们的类型是什么。

    XMLList :是XML对象的有序集合,包含在其中的XML数据可以是一个或者多个XML对象,XML对象的部分或一些单独的节点。XML类的一些方法,如children() ,将返回XMLList形式的结果。XMLList拥有许多与XML类相同的方法,大多数操作都可以交替使用。注意,XMLList中的项目是平行存在的,它们都没有父节点。

    三、通过E4X访问XML

    1.使用点运算符访问元素

    复制代码
         public var movieList:XML=<movieList>
                    <listName>My Favorite movies</listName>
                      <movie id="123">
                          <title>Titus</title>
                          <year>1999</year>
                          <director>Julie Taymor</director>
                      </movie>
                      <movie id="456">
                          <title>Rushmore</title>
                          <year>1998</year>
                          <director>Wes Anderson</director>
                      </movie>
                      <movie id="789">
                          <title>Annie Hall</title>
                          <year>1977</year>
                          <director>Woody Allen</director>
                      </movie>
                  </movieList>;
    复制代码

    使用点运算符可以访问movieList中的任何元素。只需要将访问的元素作为movieList对象的属性,写出塔的名称即可,如:movieList.listName
    对拥有多个相同类型节点的元素,需要以数组的方式访问,如 movieList.movie[0]

    2.使用方法访问子节点

    A、 child(propertyName:Object):XMLList

    获取特定子节点集合,如movieList.child("movie") 与movieList .movie相同,使用它可以搜索指定名称的任何字节点,如movieList.movie.child("title") 。

    使用propertyName参数可列出特定XML子项的内容。列如,若要返回名为<title>

    使用子项的索引编号,可以生成相同的结果。索引编号标示该子项在其XML子项列中的位置。例如,movieList.child(0)将返回列表中的第一个子项。

    使用星号(*)可以返回xml文档中所有的子项,例如,moveList.child("*").

    B、childIndex():int

    确定该XML对象在其父项上下文中从0开始编制索引的位置。

    如:trace(movieList.child(2).child("director").childIndex());

    trace(movieList.movie[0].year.childIndex());

    C、 children():XMLList

    按XML对象的显示顺序列出其子项。根据下标获取子元素,如:

    trace(movieList.children()[0].toXMLString());

    trace(movieList.children()[2].children()[0].toXMLString());

    D、 length():int返回特定子节点集合的长度

    E、 name():Object返回正在访问的子节点的节点名称。


    F、 elements(name:Object = *):XMLList 列出某XML对象的元素。

    3.使用at运算符@访问属性

    trace(movieList.child("movie")[0].@id);
    如果要访问某标记的所有属性,可以使用*号,如trace(movieList.child("movie")[0].@*);
    与.运算符对应的方法是child()和children()
    与@运算符对应的方法是attribute()和attributes()

    4.访问元素中的文本

     要明确的返回某个元素的文本节点,可以使用text()方法,该方法返回一个由文本节点组成的XMLList。
     注意:操作XML时,toString()返回节点的值(可以为空),toXMLString()返回节点和其中的文本。

    5.访问祖先节点、访问子孙节点

    E4X中的一个非常强大的特性就是能够直接访问子孙节点。使用子孙节点存取程序运算符(..),可以深入访问元素中的节点,而不用担心该节点的路径是什么。这种方法不仅适用于元素,而且还适用于属性和其他类型的XML对象。
      trace(movieList..title);//这个我真帅
      trace(movieList..@*.toXMLString());
      此运算符对应的方法为:descendants()
      使用此方法时需要注意一点,它会返回所有匹配的结果,即使树的不同层次上的标记拥有相同的名称也是如此。

    访问祖先结点
      parent()方法将返回特定XML对象的上一层的节点。

    6.迭代元素的子节点

    复制代码
    XMLList类似专用于存储XML数据段的数组,它们与数组一样拥有长度和下标,可以像操作数组那样对它们执行迭代操作。
                  var movieTitles:Array=new Array();
                  var movies:XMLList=movieList.movie;
                  for(var i:int=0;i<movies.length();i++){
                          movieTitles[i]=movies[i].title.text();
                  }
                  movieTitles.sort();
                  trace(movieTitles);
                  此外,可以使用for...in或for each...in语句迭代XMLList对象
                
                  var movies:XMLList=movieList.movie;
                  for(var movie:String in movies){
                          trace(movies[movie].title);
                  }
                
                  var movies:XMLList=movieList.movie;
                  for each(var movie:XML in movies){
                          trace(movie.title);
                  }
    复制代码

    7.筛选XML中的项目

    EX4增加了一种强大的功能:使用XML圆括号筛选运算符动态地筛选数据。在XML树中创建路径时,可以在圆括号中间添加一个布尔表达式形式的搜索来判断条件,符合搜索条件的任何节点都将返回到一个XMLList中。
      var movies:XMLList=movieList.movie.(year>1985);
      trace(movies);
      movies=movieList.movie.(@id=="789");
      trace(movies);
      movies=movieList.movie.(director.search("W")!=-1 && title.search(" ")==-1);
      trace(movies);

    四、构建XML对象

    1.结合XML节点

    与合并字符串类似,可以使用+或+=运算符将额外的子元素添加到某个XMLList中。所添加的值不需要与XML对象中其他元素保持相同的格式。可以使用+和+=运算符将额外的节点添加到具体元素中。

    var anotherMovie:XML=<movie id="222">
       <title>Tron</title>
       <year>1982</year>
       <director>Steven Lisberger</director>
      </movie>;
      movieList.movie+=anotherMovie;

    appendChild():与+=类似,将值添加到XML对象或XMLList的末尾。
      prependChild():将值添加到对象的开始部分。
      insertChildAfter()、insertChildBefore():将值添加到指定位置。

      movieList.movie[0].appendChild(<area>你</area>);
      movieList.movie[1].prependChild(<area>真</area>);
      movieList.movie[2].insertChildBefore(movieList.movie[2].year,<area>棒</area>);
      movieList.movie[3].insertChildAfter(movieList.movie[3].year,<area>呀</area>);

    2.删除XML节点

    与结合XML结点不同,没有任何方法可以删除XML节点,相反,只能使用delete运算符。该运算符用于从树中删除指定的元素或值。
      delete movieList.movie.@*;//删除所有属性
      delete movieList.movie[1];

    3.复制XML对象

     使用copy方法复制XML对象。
      var template:XML=<person><name><first /><last /></name></person>;
      var me:XML=template;//me引用template,对me的修改也是对template的修改
      var it:XML=template.copy();//创建副本
      me.name.first="First Name";
      me.name.last="Last Name";

    4.替换XML节点中的值

    setChildren()方法可以一次替换XML对象中的所有节点
    replace()方法则替换XML对象中的单个节点
    var m123:XMLList=movieList.movie.(@id==123);
    //m123.setChildren(null);
    m123.setChildren(<title>Avatar</title>+<year>2009</year>+<director>Cameron</director>);//注意使用+号连接多个节点
    m123.replace("title",<title>阿凡达</title>);

    5.与字符串相互转换

     将字符串转换为XML时需要格外注意,只能使用格式良好的XML文本,操作失败将会造成运行时错误。
      var xml:XML=XML(xmlString);
      美观打印
      XML.prettyPrinting:默认值为true,将其设置为false时,XML字符串将自动格式化、删除空标记和额外的空白符。
      XML.prettyIndent:默认值为2,设置缩进的空格数

    五、从外部资源加载XML数据

    复制代码
    import flash.net.*;
                
                  var movieList:XML;
                  var url:URLRequest=new URLRequest("movieList.xml");
                  var loader:URLLoader=new URLLoader(url);
                  loader.addEventListener(Event.COMPLETE,onLoadCompleted);
                  function onLoadCompleted(e:Event):void{
                          if(loader.data){
                                  movieList=XML(loader.data);
                                  trace(movieList);
                          }
                  };
    复制代码

    六、收集XML节点的元信息

    1.查找节点类型

     要判断当前节点的类型,可以对要检查的分支使用nodeKind()方法。该方法返回一个描述节点类型的字符串:element attribute text comment processing-instruction

    2.判断节点内容的类型

     hasSimpleContent():简单内容类型
    hasComplexContent():复杂内容类型

    七、使用命名空间、使用注释和处理命令、设置XML类型选项

     ☆使用名称空间
      
    名称空间是在XML中使用的一种约定,其作用是将功能相似的XML元素和属性归入同一集合中,这与使用包对类进行分类极为相似。XML文件将在名称空间声明中定义名称空间的名称和一个惟一的标识符,用于将它与其他名称空间区分开来。
      var ns:Namespace=new Namespace(uri);//省略前缀
      var ns:Namespace=new Namespace(prefix,uri);
      示例
      var diffbook:XML=<book xmlns:bible="http://www.gaobar.cn">
       <bible:chapter>Working with XML</bible:chapter>
      </book>;
      可以使用名称空间访问节点——双冒号(::)结合名称空间对象来访问非默认名称空间的节点,如
      var bible:Namespace=diffbook.namespace("bible");
      trace(bible);//http://www.gaobar.cn
      trace(bible.prefix);//bible
      trace(bible.uri);//http://www.gaobar.cn
      trace(diffbook.bible::chapter);//Working with XML
      trace(diffbook.bible::chapter.name());//http://www.gaobar.cn::chapter
      trace(diffbook.bible::chapter.localName());//chapter
      相关方法addNamespace()、removeNamespace()、setNamespace()、localName()参阅帮助文档。

    ☆使用注释和处理指令
      
    代码中包含的XML注释块和处理指令都不是节点,要访问这些值,可以使用comments()和processingInstructions()方法分别获取注释和处理指令的XMLList。
      注意,静态属性ignoreComments和ignoreProcessingInstructions的默认值都是true,需要将它们设置为false才能保证comments()和processingInstructions()方法能够正常运行。

    ☆设置XML类的选项
      
    ignoreWhitespace
      ignoreComments
      ignoreProcessingInstructions
      prettyPrinting
      prettyIndent
      可以使用settings()静态方法访问所有这些设置,它将返回一个含有各变量值的对象。
      还可以使用defaultSettings()静态方法获取所有这些属性的默认值,setSettings()静态方法可用于将settings对象修改为新Object。
      XML.setSettings(XML.defaultSettings());//将XML设置恢复为默认值

  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/zhepama/p/4238418.html
Copyright © 2011-2022 走看看