• Flash与XML数据交互


    在AS3里,对XML的控制变得非常方便了,有用过AS2的读者都知道,如果我们用AS2去访问一个节点,做法是xmlObj.firstChild.childNodes[2]如果复杂的XML结构就更麻烦了,所以在AS2时需要把一系统的节点用一个值来先做“替身”即xmlList= xmlObj.firstChild.childNodes来降底程序的复杂程序。

    AS3里使用E4X(ECMAScript for XML)来规范定义组用于处理 XML 数据的类和功能。E4X 类的方法、属性和运算符实现以下便利:

    · 简单:在可能的情况下,使用 E4X 可以更容易地编写和理解用于处理 XML 数据的代码。

    · 一致:E4X 背后的方法和推理在内部是一致的,并与 ActionScript 的其它部分保持一致。

    · 熟悉:使用众所周知的运算符来处理 XML 数据,如点 (.) 运算符。

    E4X 类有包括XML、XMLList、QName 和 Namespace。下面我们来看看XML类,如何创建修改XML文件。

    :本文出自《FlashCS3 动画制作一点通》 节选于第十一章

    11.3.1  声明XML对象

    XML 对象可能表示 XML 元素、属性、注释、处理指令或文本元素。

    声明一个XML对象基本语法如下:

    var xml:XML=new XML(<myxml>xml文件</myxml>)

     

    使用new XML()创建XML对象,AS3声明XML对象比较灵活了,XML对象里的内容可以用引号也可以像上面的代码不使用引号。更直接的声音方式直接赋值,只要XML结构是正确的就行,如下:

    var xml=

        <myxml>

            <item id='1'>

                 <menuName>burger</menuName>

                 <price>3.95</price>

            </item>

        </myxml>

    trace(xml.toXMLString())

     

     

     

     

     

     

     

     

    第8行,使用对象的toXMLString()方法输出xml,这个方法要和toString()区分开来,还有一个是输出XML文本结点的方法text(),我们先来区分一下这三个方法,便于我们后面的学习。

    范例如下:

    var xml:XML=

             <body>

                 text1

                 <bar>barText1</bar>

                 <bar>barText1</bar>

                 text2

             </body>

    trace(xml.text());//输出:text1text2

    trace(xml.text()[0]);//输出:text1

    trace(xml.text()[1]);//输出: text2

    trace(xml.child(1).toXMLString());//输出:<bar>barText1</bar>

    trace(xml.child(1).toString());//输出:barText1

    Ø        

     

     

     

     

     

     

     

     

     

     

     

     

    toXMLString()方法:始终返回XML 对象的开始标签、属性和结束标签的字符串型式。

    toString()方法:只是按字符串形式返回节点的内容。

    text()方法:则是返回XML 文本节点的所有 XML 属性的 XMLList 对象,上面的例子,有两个文本节点text1和text2。

    11.3.2  XML节点访问

    存取节点是使用XML对象的基础,要用好XML先要掌握管理XML类的方法,XML类提供了以下各管理节点的方法。

     

    1.访问XML各节点。

    在学习访问XML节点前,要先弄明白XML各层次的关系后面,要使用这个层级与节点编号来访问不同位置的节点。

    虽然我们看来,“<item>text1<item>”只是一段包含<item>卷标元素的字符串而以,但是经过Flash内部的XML解析器处理后,XML里的每个元素都会被展现成树状的层级结构,各层之间都存在规律性的编号。我们把下面的代码分解如图11-12所示。

    var xml:XML=

        <myxml>

            <item>

                 <pro>proText</pro>

            </item>

            <item>text1</item>

            <item>text2</item>

        </myxml>

     

     

     

     

     

     

     

     

     

    图11-12用IE浏览XML文件

    上图中,红色方块表示卷标,黑色方块表示文字元素。XML中卷标和文字元素都算是一个节点。XML结构如同一个二维表对横向和纵向进行编号,我们常要使用这个编号访问各节点。

    在AS2里,我们常使用xmlObj.firstChild.childNodes[0]来访问节点。AS3里我们有很多方法来访问不同位置的节点,首先介绍使用child()访问节点。

    ① child()方法 (propertyName:Object):XMLList

    使用child()方法列出其子项,一个XML子项就是一个XML元素、文本节点、注释或处理指令。代码如下:

    var xml:XML=

             <foo>

                 <bar>text1</bar>

                 <bar>text1</bar>

             </foo>

    trace(xml.child("bar").length());

    //输出2

    trace(xml.child("bar")[0].toXMLString());

    //输出: <bar>text1</bar>

    trace(xml.child("bar") [1].toXMLString ());

    //输出: <bar>text2</bar>

     

     

     

     

     

     

     

     

     

     

    child()方法,可以直接使用子项目编号来读取,及child(1)比如上面的xml对象,我们用xml.child("bar")[0]和xml.child(1)输出结果是一样的。如果用“*”号代替编号则表示输出所有节点,范例代码如下:

    var xml:XML=

             <foo>

                 <bar>text1</bar>

              ,    <bar>text1<, /bar>

             </foo>

    trace(xml.child("bar")[0].toXMLString());

    //输出: <bar>text1</bar>

    trace(xml.child(0).toXMLString());

    //输出: <bar>text1</bar>

    trace(xml.child("*").toXMLString ());

    //输出:<bar>text1</bar> <bar>text2</bar>

     

     

     

     

     

     

     

     

     

     

     

     

    ② children()方法 (propertyName:Object):XMLList

    children()按照XML对象的显示顺序列出其子项。一个XML子项就是一个XML元素、文本节点、注释或处理指令。和child()方法不同,child只是读取单个子项的,而children()是读取所有的子项。我们也可以按子项编号用children()来完成child()的工作,下面用个范例做个对比,如下:

    var xml:XML=

             <foo>

                 <bar>text1</bar>

                 <bar>text2</bar>

             </foo>

    trace(xml.children());

    //输出: <bar>text1</bar><bar>text2</bar>

    trace(xml.children()[0].toXMLString());//输出text1

    trace(xml.child(0).toXMLString());//输出text1

     

     

     

     

     

     

     

     

     

    代码中,第6行children()没有用编号时,则读取所有的子项结点。第8行,xml.children()[0]读取编号为0的节点,这和第9行使用child()方法读取单条节点项的作用是一样的。

    ③ elements () 方法 (name:Object = *):XMLList

    elements()方法可以列出XML对象的元素。一个由开始和结束标签组成的元素,可以使用参数name,用节点名子访问,也可以使用“*”访问所有节点。范例如下:

    var xml:XML=

             <body>

                 <bar>barText1</bar>

                 <bar>barText2</bar>

             </body>

    trace(xml.elements("*"));//输出: <bar>barText1</bar><bar>barText2</bar>

    trace(xml.elements("*")[0].toXMLString());//输出: <bar>barText1</bar>

    trace(xml.elements("bar").length());//输出: 2

    trace(xml.elements("bar")[1].toXMLString());//输出: <bar>barText2</bar>

     

     

     

     

     

     

     

     

    elements()看起来和children()一样,都是读取XML对象的所有子项。这两个方法是有区别的,而且区别很大。elements()只是读取XML对象的元素,如<bar>batText<bar/>或者单个元素<bar/>,而children()都是读取所有的子项,包括文本节点、注释或处理指令等,只要在XML里有设置其注释与指令能输出,并可以用children()。对比范例如下:

    XML.ignoreComments=false;//先设置不忽略注释才能用childern获取注释

    XML.ignoreProcessingInstructions=false;//先设置不忽略XML指令

    var myxml:XML=

             <body>

                 <bar>44</bar>

                 dtext

                 <!--这是注释-->

                 <btt/>

    <?一个指令?>

             </body>;

    trace(myxml.children().toXMLString());

    /*输出所有子项:

                 <bar>44</bar>

                 dtext

                 <!--这是注释-->

                 <btt/>

    <?一个指令?>

    */

    trace(myxml.elements("*").toXMLString());

    //输出: <bar>44</bar> <btt/>

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    对比下第11行和第19行,两种方法输出的子项,现在可以很显视地区分这两个方法了。

    ④ descendants()方法 (name:Object = *):XMLList

     descendants()是读取包含给定 name 参数的 XML 对象的所有后代(子级、孙级、曾孙级等)。这和前面介绍的几个方法又有所不同了,前面介绍的child()、children()和elements()都只是读取所指点的那层的子项,而这个descendants()是读取其下面所有的层级子项,所用的参数和elements()是一样可以使用参数name,用节点名子访问,也可以使用“*”访问所有节点。范例如下:

    var xml:XML=

             <body>

                 <a>

                     <b>text1</b>

                 </a>

                 <b>text2</b>

             </body>

    trace(xml.descendants("b").toXMLString());//输出: <bar>text1</bar><bar>text2</bar>

    trace(xml.child("b").toXMLString());//输出: <bar>text1</bar>

     

     

     

     

     

     

     

     

     

     

    对比下使用descendants()和child()读取节名b后的区别,child()只是从当前层读取节点b,descendants()则读取XML对象里所有节点名为b的节点,我们可以xml.descendants("b")[1]用编号去选取需要访问的结点,从而在不清楚XML对象里节点名为“b”的层次位置也能很好的访问。

    ⑤ “.”dot (XML) 运算符

    这里,还可以使用点运算符来读取XML的结点,别看这个“小不点”点运算符在AS里的并不莫生,作用也大着。AS2时代,我们使用点运算符来向影片剪辑的深层次访问变量,现在XML的层级关系里,一样可以灵活地运用点运算符来问了。范例如下:

    var xml:XML=

             <foo>

         &nbs, p;      , ; <bar>text1</bar>

                 <bar>text2</bar>

             </foo>

    trace(xml.bar);

    //输出: <bar>text1</bar><bar>text2, </bar>

    trace(xml.bar[1].toXMLString());

    //输出: <bar>text2</bar>

     

     

     

     

     

     

     

     

     第6行,使用点运算符,直接访问节点名则获得他所有的子项这和上面介绍的xml.children()作用一样,只是children可以在未知节点名的情况下获取所有子项,第8行则跟child(1)的作用一样了。

    ⑥ 使用parent()访问上一级节点

    在AS2里,访问上一个节点是使用parentNode,还有firstChild、lastChild、nextSibling等等,层级之间的访问方法比较多。

    现在AS3的XML类对于层级之间的访问方法只留了个parent()其它的都被去了。因为XML对象的访问很灵活了,在AS2时所用的很多方法都可以使用别的来替代了。我们来看下parent的使用,第11行,声明对象,一个在xml结点上位置第三层的“<li>1</li>”,然后在第14行用parent()查看下他上一级是什么,则输出节点<ul>。代码如下:

    var xml:XML=

             <top>

                 <p>child0</p>

            &n, bsp;    <p>

                    <ul>

    <li>1</li>

    <li>2</li>

    </ul>

                 </p>

             </top>;

    var node:XML=xml.child("p")[1].child("ul").child("li")[1];

    //上面的,表示把<li>1<li>给node对象

    //我们再用node.parent()看看他上一个节点是什么

    trace(node.parent());

    /*输出node的上一个节点所有子项

    <ul>

    <li>1</li>

    <li>2</li>

    </ul>

    */

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    ⑦ childIndex()方法

    childIndex()方法不是用来读取节点的,是用来获取节点的位置,其父项上下文中从0开始编制索引的位置,范例如下:

    var myxml:XML=<topxml>

                     <bar>text1</bar>

                     <btext/>

                   </topxml>

    trace(myxml.childIndex());//输出:-1

    trace(myxml.bar.childIndex());//输出:0

    trace(myxml.btxt.childIndex());//输出:1

     

     

     

     

     

     

     

    2.访问XML的属性

    每个卷标都可以拥有一个以上的属性,这个属性可以像我们AS里的字符型变量一样存放一段字符串,访问属性XML对象提供了下面几个方法。

    ① attribute(attributeName:*):XMLList

    使用attribute()读取与参数相符属性的值,如下:

    var xml:XML=

                 <myxml theName="大山" theSex="男">

                    <item theAge="30">text1</item>

                 </myxml>

    trace(xml.attribute("theName"));//输出:大男

    trace(xml. attribute("*"));//输出:大山男

    trace(xml. attribute("*")[1]);//输出:男

     

     

     

     

     

     

     

    attribute()可以使用“*”号输出下面所有属性。使用属性名读取时,属性名是区分大小写的,这和我们的变量规则一样。如图没有这个属性则输出一个空值,不会报错。

    ② attributes(attributeName:*):XMLList

    使用attributes()返回给定 XML 对象的属性值列表。结合使用 name()方法和attributes()方法可返回属性的名称。

    和上面的attribute()方法有些不一样,上面那个方法是读取单个属性值。而这个方法是读取属性值列表,所以使用xml.attribute(“*”)和xml.attributes()输出结果一样,都是获取所有属性,范例如下:

    var xml:XML=<img id=’20’ imgName=’myphoto’/>

    trace(xml.attribute("*"));//输出:20myphoto

    trace(xml.attribute("*")[1]);//输出:myphoto

    trace(xml.attribute());//输出:20myphoto

    trace(xml.attribute().length());//输出:2

    trace(xml.attribute()[1]);//输出:myphoto

     

     

     

     

     

     

     

     

    ③ @运算符attribute identifier运算符

    @运算符可以像attribute()方法一样,取得属性值。也可以结合“*”号来取得指定层下所有的节点值,代码如下:

    var xml:XML=<img id=’20’ imgName=’myphoto’/>

    trace(xml.@id);//输出:20

    trace(xml.@*.length());//输出:2

    trace(xml. @*);//输出:20myphoto

    trace(xml. @*[1]);//输出:myphoto

     

     

     

     

     

     

     

    @运算符配合“*”获取所有属性时,不用加双引号。我们可以很方便地使用@算符替代attribute(),下面我们再看看使用@向卷标里存入属性。

    var xml:XML=<img id=’20’ imgName=’myphoto’/>

    xml.@newing="newphoto"//新创建一个属性newing

    trace(xml.@*.length());//输出:3

    trace(xml.@*);//输出:20myphotonewphoto

    trace(xml. @*[2]);//输出:newphoto

     

     

     

     

     

     

     

    ④ name()

    name()方法用来获取限定名称,限定名称也就是卷标名或者属性名。name()可获取各节点或属性名,范例如下:

    var myxml:XML=<topxml>

                    <bar va="123">text1</bar>

                  </topxml, >

    trace(myxml.name());//输出:topxml

    trace(myxml.child ("*")[0].na, me());//输出:bar

    trace(myxml.child(0).attributes()[0].name());//输出:va

     

     

     

     

     

     

    3.XML节点管理

    XML节点管理即节点的添加删除复制等管理。

    ① appendChild方法(child:Object):XML

    将给定子项追加到该XML对象属性的末尾。appendChild()方法可采用 XML 对象、XMLList 对象或随后转换为 String 的任何其它数据类型。范例如下:

    var myxml:XML=<topxml>

                    <bar va="123">text1</bar>

                  </topxml>

    myxml.appendChild(<newbar>text2</newbar>);

    trace(myxml.bar.toXMLString());//输出:<bar va= "123">text1</bar>

    trace(myxml.newbar. toXMLString());//输出: <newbar>text2</newbar>

     

     

     

     

     

     

    ② insertChildAfter()方法(child1:Object, child2:Object):*

    在该XML对象的child1参数后插入给定的child2参数并返回生成的对象。如果child1参数为null,该方法将在XML对象的所有子项之前插入child2的内容(也就是说,不在任何子项之后)。

    如果提供child1,但XML对象中不包含该参数,则不修改该XML对象并返回undefined。

    如果对不是元素(文本、属性、注释、pi 等等)的XML子项调用该方法,则返回undefined。范例如下:

    var myxml:XML=<topxml>

                   <bar>text1</bar>

    <bar>text2</bar>

                 </topxml>;

    myxml.insertChildAfter(myxml.bar[0],<newbar>text1</newbar>);

    trace(myxml)

     

     

     

     

     

     

     

     

    输出以后,新的XML节点被插入到中间,如下:

    <topxml>

    <bar>text1</bar>

    <newbar>text1</newbar>

    <bar>text2</bar>

    </topxml>;

     

     

     

     

     

     

     

    ③ insertChildBefore()方法(child1:Object, child2:Object):*

    和上面的insertChildAfter()方法的相似,这个方法是在对象的child1参数后面插入给定的child2参数并返回生成的对象。

    如果提供child1,但XML对象中不包含该参数,则不修改该XML对象并返回undefined。

    如果对不是元素(文本、属性、注释、pi 等等)的XML子项调用该方法,则返回undefined。范例如下:

    var myxml:XML=<topxml>

                   <bar>text1</bar>

    <bar>text2</bar>

                 </topxml>;

    myxml.insertChildBefore(myxml.bar[0],<newbar>text1</newbar>);

    trace(myxml)

     

     

     

     

     

     

    输出以后,新的XML节点被插入到了第一个位置,如下:

    <topxml>

    <newbar>text1</newbar>

    <bar>text1</bar>

    <bar>text2</bar>

    </topxml>;

     

     

     

     

     

     

     

    ④ delete()运算符

    delete()不是XML的方法,他是一个运算符。XML没有提供删除节点的方法了,这个运算符完全可以满足我们的需求即删除指定的节点,使用delete可以删除节点也可以删除属性,范例如下。

    var myxml:XML=<topxml>

                    <bar va="123">text1</bar>

                    <bar>text2</bar>

    <bar>text3</bar>

                 </topxml>;

    delete(myxml.bar[1]);//删除第二个节点

    delete(myxml.bar[0].@va);//删除属性va

    trace(myxml)

     

     

     

     

     

     

     

     

    删除了节点和属性后输出如下:

    <topxml>

    <bar>text1</bar>

    <bar>text3</bar>

    </topxml>;

     

     

     

     

     

     

    ⑤ normalize()方法

    normalize()用于合并相邻所有文本节点。比如<bar>text1<bar>如果文本结点text1有两个以上,并可用这个方法将他们合并,范例如下:

    var xml:XML=<body>text1</body>;

    trace(xml.children().length());//输出: 1

    xml.appendChild("newtext");//再添加一个文本节点newtext

    trace(xml.children().length());//输出: 2

    xml.normalize();//合并两个文本点

    trace(xml..toXMLString());//输出: <body>text1newtext</body>

    trace(xml.children().length());//输出: 1

     

     

     

     

     

     

     

    ⑥ replace()方法(propertyName:Object,value:XML):XML

    用给定的value参数替换propertyName参数所指定的属性。如果没有属性与propertyName匹配,会将XML对象保持为未修改状态。

    var xml:XML=

             <foo>

                <bar>

                  <bar1_1>text1_1</bar1_1>

                  <bar1_2>text1_2</bar1_2>

                </bar>

             </foo>

    xml.child(0).replace(1,<bar>newbar</bar>);

    trace(xml);

     

     

     

     

     

     

     

     

     

    上面的代码使用卷标<bar>替换了<bar1_2>以后,输出如下:

       <foo>

                <bar>

                  <bar1_1>text1_1</bar1_1>

                  <bar>newbar</bar>

                </bar>

             </foo>

     

     

    aliyun活动 https://www.aliyun.com/acts/limit-buy?userCode=re2o7acl
  • 相关阅读:
    基于Netty实现高性能通信程序之传输协议编码与解码
    博客园停止文章更新,最新文章请访问 www.zhaoyafei.cn,多谢您的支持!
    再谈PHP错误与异常处理
    C语言之预处理
    【转】linux sort 命令详解
    GO语言之channel
    浅谈Yii-admin的权限控制
    【转】搞清FastCgi与PHP-fpm之间的关系
    网站添加第三方登陆(PHP版)
    【转】PHP的Trait 特性
  • 原文地址:https://www.cnblogs.com/wangbin/p/2229748.html
Copyright © 2020-2023  润新知