`

Flex 处理数据 访问 XML 数据

    博客分类:
  • Flex
阅读更多
<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="500" height="470"
    creationComplete="myDataGrid.selectedIndex=0;"
>

    <mx:Script>
        <![CDATA[        
            // Model: XML structure describing 
            // some of the books in my collection.    
            [Bindable]

            private var myBooks:XML = 
                <books>
                    <book ISBN="1590595181">

                        <title>Foundation ActionScript Animation: Making Things Move</title>
                        <author>Keith Peters</author>
                        <amazonUrl>http://tinyurl.com/npuxt</amazonUrl>

                    </book>
                    <book ISBN="1582346194">
                        <title>Send in the Idiots: Stories from the Other Side of Autism</title>

                        <author>Kamran Nazeer</author>
                        <amazonUrl>http://tinyurl.com/lo5ts</amazonUrl>
                    </book>

                </books>
        ]]>
    </mx:Script>
    
    <!-- Keep track of the currently selected book -->
    <mx:Number id="selectedBookIndex">{myDataGrid.selectedIndex}</mx:Number>

    
    <!-- User interface -->
    <mx:Panel 
        title="Assigning XML data"
        paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"
    >

        <!-- Master view: Display all books -->
        <mx:DataGrid id="myDataGrid" dataProvider="{myBooks.book}">

            <mx:columns>
                <mx:DataGridColumn dataField="@ISBN" headerText="ISBN" width="85"/>
                <mx:DataGridColumn dataField="title" headerText="Title"/>

                <mx:DataGridColumn dataField="author" headerText="Author"/>
                <mx:DataGridColumn dataField="amazonUrl" headerText="Web site">

                    <mx:itemRenderer>
                        <mx:Component>
                            <mx:LinkButton
                                label="Visit"
                                click="navigateToURL(new URLRequest(data.amazonUrl), 'blank');"
                            />                                    
                        </mx:Component>

                    </mx:itemRenderer>                        
                </mx:DataGridColumn>
            </mx:columns>
        </mx:DataGrid>
        
        <!-- Detail view: Display currently selected book for editing -->

        <mx:Form width="100%" autoLayout="false">
            <mx:FormHeading label="Edit book details"/>

            <mx:FormItem label="ISBN:" width="100%">
                <mx:TextInput 
                    id="isbnInput" 
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].@ISBN}"
                    change="{myBooks.book[selectedBookIndex].@ISBN = isbnInput.text}"
                />

            </mx:FormItem>
            <mx:FormItem label="Title:" width="
    100%">
                <mx:TextInput 
                    id="titleInput" 
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].title}"
                    change="{myBooks.book[selectedBookIndex].title = titleInput.text}"
                />

            </mx:FormItem>
            <mx:FormItem label="Author:" width="100%">
                <mx:TextInput 
                    id="authorInput"
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].author}"
                    change="{myBooks.book[selectedBookIndex].author = authorInput.text}"
                />

            </mx:FormItem>
            <mx:FormItem label="Amazon Url" width="100%">
                <mx:TextInput 
                    id="amazonUrlInput"
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].amazonUrl}"
                    change="{myBooks.book[selectedBookIndex].amazonUrl = amazonUrlInput.text}"
                />

            </mx:FormItem>        
        </mx:Form>
    </mx:Panel>
</mx:Application>

 Actionscript 3.0组类基于ECMAScript for XML(E4X)说明(ECMA-357 2第二版)。这些类功能强大,使用简单,对处理XMLdata数据非常有用。相比以前的编程技术使用E4X的开发代码使得XML数据更快。

  • 介绍XML
  • 对XML元素与属性赋值
  • 通过传递数据引用创建XML对象
  • 装配与改变XML对象
  • 查询XML数据


介绍XML
许多服务器端应用程序使用XML数据结构,那么你可以在ActionScript中使用XML类来创建优雅的富互联网应用程序。例如那些链接到Web service的应用。web service是连接应用程序的重要的方法,例如,一个Adobe Flash Player9 应用程序和一个在web服务器上的应用程序通过公共标准,例如Simple Object Access Protocol(SOAP)

在Adobe Flex中,ECMAScript for XML说明书定义了一系列的类和功能来处理XML数据。这些类和函数的集合被称为E4X.两个主要的类是XML和XMLList。

注意:在ActionScript 2.0中有一个XML类。在ActionScript 3.0中,它被重命名为XMLDocument这样就不会与新的,作为E4X一部分的XML类发生冲突了。在ActionScript 3.0中,上一个版本遗留的类——XMLDocument,XMLNode,XMLParser和XMLTag——都被包含在flash.xml包中,主要是为了向下兼容。E4X类是核心类;你需要导入包才能使用他们。本快速说明没有设计对传统的ActionScript 2.0的类逐一细说。想了解他们,查看flash.xml包,在Flex 3 Language Reference中

在下边的例子中,你创建了一个XML文档,命名为myBooks。创建一个XML文档在ActionScript,通过在Actionscript块中书写XML并赋值给一个变量。由于在Flex中,XML是本地数据类型,就像Number或Boolean一样。

myBooks的XML文档包含两个book元素(element)(也被称为node(节点))。第一个book元素拥有4个子元素,名称值title,author,amazonUrl和pageCount。

要通过XML实例访问元素,使用点标示(.)就像存取一个对象的属性一样。那么,举个例子,要获得book节点的引用,你要写成myBooks.book。这就返回了一个XMLList时间,他包含了myBooks的XML中的2个book节点。要存取列表中指定节点,你需要使用数组表示法。例如,要获得第一本数节点的引用,可以写为myBooks.book[0]。如果你使用过ActionScript中的对象和数组,你应该对点操作符和数组语法风格比较熟悉。然而,E4X比这更进一步,可以按指定属性名在XML中搜索节点。

下边的例子中,使用搜索ISBN属性获得第一本书的引用。属性在 E4X中at-sign(@)为前缀描述属性,写为@ISBN。语句myBooks.book.(@ISBN==”159059181”)翻译为“找到一个属性ISBN值等于159059181的book节点”。另一个例子描述更高级的查找技术。


例子

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="440" height="400"    
    initialize="initializeHandler();"
>

    <mx:Script>
        <![CDATA[
        
            [Bindable] public var a:XMLList; 
            [Bindable] public var b:XMLList;
            [Bindable] public var c:XMLList;
            [Bindable] public var d:XMLList;

            // Model: XML structure describing 
            // some of the books in my collection.    
            [Bindable]
            private var myBooks:XML = 
                <books>

                    <book ISBN="1590595181">
                        <title>Foundation ActionScript Animation: Making Things Move</title>
                        <author>Keith Peters</author>

                        <amazonUrl>http://tinyurl.com/npuxt</amazonUrl>
                        <pageCount>470</pageCount>
                    </book>

                    <book ISBN="1582346194">
                        <title>Send in the Idiots: Stories from the Other Side of Autism</title>

                        <author>Kamran Nazeer</author>
                        <amazonUrl>http://tinyurl.com/lo5ts</amazonUrl>
                        <pageCount>500</pageCount>

                    </book>
                </books>
            
            private function initializeHandler():void

            {
                // An XML list that contains both book nodes.                
                a = myBooks.book; 
                
                // Keith Peters         
                b = myBooks.book[0].author;
                
                // 470

                c = myBooks.book.(@ISBN=="1590595181").pageCount;

                // Delete the first book node.
                delete myBooks.book[0];
                
                // Send in the Idiots...
                d = myBooks.book[0].title; 
            }
        ]]>
    </mx:Script>

    
    <!-- User interface -->
    <mx:Panel 
        title="XML lookup results"
        paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10">

        <mx:Text text="{'a: ' + a}" width="300"/>
        <mx:Label text="{'b: ' + b}"/>        
        <mx:Label text="{'c: ' + c}"/>

        <mx:Label text="{'d: ' + d}"/>
    </mx:Panel>

</mx:Application>

 

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="500" height="470"
    creationComplete="myDataGrid.selectedIndex=0;"
>

    <mx:Script>
        <![CDATA[        
            // Model: XML structure describing 
            // some of the books in my collection.    
            [Bindable]

            private var myBooks:XML = 
                <books>
                    <book ISBN="1590595181">

                        <title>Foundation ActionScript Animation: Making Things Move</title>
                        <author>Keith Peters</author>
                        <amazonUrl>http://tinyurl.com/npuxt</amazonUrl>

                    </book>
                    <book ISBN="1582346194">
                        <title>Send in the Idiots: Stories from the Other Side of Autism</title>

                        <author>Kamran Nazeer</author>
                        <amazonUrl>http://tinyurl.com/lo5ts</amazonUrl>
                    </book>

                </books>
        ]]>
    </mx:Script>
    
    <!-- Keep track of the currently selected book -->
    <mx:Number id="selectedBookIndex">{myDataGrid.selectedIndex}</mx:Number>

    
    <!-- User interface -->
    <mx:Panel 
        title="Assigning XML data"
        paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"
    >

        <!-- Master view: Display all books -->
        <mx:DataGrid id="myDataGrid" dataProvider="{myBooks.book}">

            <mx:columns>
                <mx:DataGridColumn dataField="@ISBN" headerText="ISBN" width="85"/>
                <mx:DataGridColumn dataField="title" headerText="Title"/>

                <mx:DataGridColumn dataField="author" headerText="Author"/>
                <mx:DataGridColumn dataField="amazonUrl" headerText="Web site">

                    <mx:itemRenderer>
                        <mx:Component>
                            <mx:LinkButton
                                label="Visit"
                                click="navigateToURL(new URLRequest(data.amazonUrl), 'blank');"
                            />                                    
                        </mx:Component>

                    </mx:itemRenderer>                        
                </mx:DataGridColumn>
            </mx:columns>
        </mx:DataGrid>
        
        <!-- Detail view: Display currently selected book for editing -->

        <mx:Form width="100%" autoLayout="false">
            <mx:FormHeading label="Edit book details"/>

            <mx:FormItem label="ISBN:" width="100%">
                <mx:TextInput 
                    id="isbnInput" 
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].@ISBN}"
                    change="{myBooks.book[selectedBookIndex].@ISBN = isbnInput.text}"
                />

            </mx:FormItem>
            <mx:FormItem label="Title:" width="
    100%">
                <mx:TextInput 
                    id="titleInput" 
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].title}"
                    change="{myBooks.book[selectedBookIndex].title = titleInput.text}"
                />

            </mx:FormItem>
            <mx:FormItem label="Author:" width="100%">
                <mx:TextInput 
                    id="authorInput"
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].author}"
                    change="{myBooks.book[selectedBookIndex].author = authorInput.text}"
                />

            </mx:FormItem>
            <mx:FormItem label="Amazon Url" width="100%">
                <mx:TextInput 
                    id="amazonUrlInput"
                    width="100%"
                    text="{myBooks.book[selectedBookIndex].amazonUrl}"
                    change="{myBooks.book[selectedBookIndex].amazonUrl = amazonUrlInput.text}"
                />

            </mx:FormItem>        
        </mx:Form>
    </mx:Panel>
</mx:Application>

 

 

通过传递数据引用创建XML对象


前边介绍XML的例子展示了使用XML文档初始化XML对象的方法。当创建一个XML文档时,你也可以通过引用(来自其他变量的引用)传递数到XML对象中,通过大括号扩起来的变量值引用。

如果你创建的XML结构不是有效的XML,你会看到类型错误的运行时错误。

下边的例子动态的创建了一个XML对象。它基于用户提供的变量来创建属性名,属性值,标签名和标签内容。例子检查了TypeError的情况,通过使用try…catch块环绕XML初始化代码。

例子

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="500" height="400"    
    initialize="createXML();"
>
    <mx:Script>
        <![CDATA[
            [Bindable]
            public var xml:XML
                        
            private function createXML():void

            {
                try 
                {
                    // Create the XML object using the values provided
                    // by the user for the tag name, attribute name,
                    // attribute value and the tag's contents. 
                    xml = 
                        <{tagName.text} 
                            {attributeName.text}={attributeValue.text}

                        >
                            {content.text}
                        </{tagName.text}>;
                }
                catch (e:TypeError)

                {
                    // Type error encountered while trying to create the
                    // XML object. The form must not be valid. Inform 
                    // the user.
                    xml = <note>Fill the form to see the tag here.</note>;
                }

            }
        ]]>
    </mx:Script>
    
    <!-- User interface -->
    <mx:Panel 
        title="Passing XML data by reference"
        layout="horizontal"
    >

        <mx:Form>
            <mx:FormItem label="Tag name:">
                <mx:TextInput id="tagName" change="createXML();"/>                
            </mx:FormItem>

            <mx:FormItem label="Attribute name:">
                <mx:TextInput id="attributeName" change="createXML();"/>

            </mx:FormItem>
            <mx:FormItem label="Attribute value:">
                <mx:TextInput id="attributeValue" change="createXML();"/>                
            </mx:FormItem>

            <mx:FormItem label="Tag content:">
                <mx:TextInput id="content" change="createXML();"/>                
            </mx:FormItem>

            
            <mx:HRule width="100%"/>
            
            <!-- Display the resulting XML -->
            <mx:TextArea 
                editable="false" 
                width="300" height="50"
                text="{xml.toXMLString()}" 
            />

        </mx:Form>
    </mx:Panel>
</mx:Application>
 

 

对XML元素与属性赋值


使用@和点( . )操作符不只可以从XML结构中读取数据的值,也可以为其赋值。

在下边的例子中,创建一个XML结构master-detail视图。master视图包含一个DataGrid 组件,用来显示书的列表。detail视图包含控件,用来编辑master视图中当前选中的图书。

master 和detail视图使用数据绑定和E4X来读取和更新XML中的数据。

下边的例子通过一下方法使用E4X:

  • myBooks.book引用book元素的XMLList对象。
  • myBook.book[selectedBookIndex]引用当前被选中的book元素。
  • myBook.book[selectedBookIndex].title引用当前被选中book元素的子元素title

要使用当前被选中图书的title更新TestInput控件tiltleInput,需要绑定TestInput控件tiltleInput的text属性到myBooks.book[selectedBookIndex].title。类似地,要使用用户最终输入更新XML,当TestInput控件tiltleInput的text属性改变时,将TestInput控件tiltleInput的text属性的值赋值给myBooks.book[selectedBookIndex].title。

detail视图中的另一个组件使用同样的方法正确的工作。


例子

分享到:
评论

相关推荐

    Flex里解析XML数据

    在Flex中,我们可以使用ActionScript 3(AS3)的XML类来处理XML数据。 2. Flex中的XML解析 在Flex中,XML对象提供了一种灵活的方式来创建、操作和解析XML文档。通过实例化XML类,我们可以加载XML数据并对其进行解析...

    Flex使用json和xml数据交互

    ### Flex使用json和xml数据交互:深度解析与实践 #### 引言 在现代Web开发领域,数据交换格式的选择对于实现高效、灵活的前后端通信至关重要。JSON(JavaScript Object Notation)与XML(Extensible Markup ...

    Flex之URLLoader加载XML

    - `public var menus:XML` 定义了一个XML变量,用于存储加载的XML数据。 - `[Bindable]` 属性标记的 `completeHandle` 函数将在加载完成时被调用。 2. `completeHandle` 函数是事件处理器,当`URLLoader`完成...

    AMF抓取flex页面数据

    6. **Flex数据解码** - 对于AMF数据的解码,开发者可以使用开源库,如Python的pyamf或Java的BlazeDS,它们提供了解码AMF消息的能力。解码后的数据可以是JSON、XML或其他结构化格式,便于分析和处理。 7. **安全与...

    flex解析xml框架实例

    通过理解和熟练运用这些工具,开发者能够构建出动态、交互性强的Flex应用程序,高效地处理来自服务器的XML数据。在实际项目中,还要注意错误处理、数据类型转换等细节,以确保程序的稳定性和健壮性。

    flex解析xml

    Flex是由Adobe开发的一种开源框架,主要用于构建富互联网应用程序...理解这些概念和方法,将有助于你在Flex应用中有效地处理和展示XML数据。无论是简单的数据展示还是复杂的交互逻辑,Flex都能通过XML提供强大的支持。

    readxml flex加载xml文件

    XMLDocument的一个显著特点是它可以捕获解析错误,这使得处理XML数据更加安全。然而,其同步加载特性可能导致程序在加载期间阻塞。 三、E4X(ECMAScript for XML) E4X是AS3中内置的XML支持,它使XML操作像处理...

    Flex:ArrayCollection转xml形式的实例

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

    flex 操作XML

    - 当处理大量XML数据时,优化性能,如使用迭代器而非递归,避免不必要的转换和复制。 综上所述,Flex中的XML操作涉及文件系统访问、网络通信、数据解析等多个方面,熟练掌握这些技能对于构建Flex应用至关重要。在...

    Flex数据访问:WebService

    Flex数据访问:WebService 在开发Flex应用程序时,与外部服务进行数据交互是非常常见的需求,而WebService组件则提供了访问SOAP Web服务的功能。SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在...

    flex 解析xml文件 httpservice

    在Flex开发中,XML文件常被用作数据存储和传输的格式,因为它结构清晰、易于理解和操作。本篇文章将深入探讨如何使用Flex解析XML文件,并通过...通过灵活运用,你可以构建出高效、可靠的Flex应用来处理各种XML数据。

    Flex处理 xml方法及实例

    总的来说,E4X在Flex中为XML处理提供了一种简洁、强大的语法,使得开发者可以更加直观地进行XML数据的读取、操作和生成,大大提高了开发效率。无论是从外部数据源加载XML,还是在应用内部创建和操作XML,E4X都为...

    flex 解析xml实例

    4. **XML与对象绑定**:Flex支持将XML数据绑定到UI组件,使得数据变化时UI自动更新。例如,将XML数据绑定到列表控件: ```actionscript &lt;mx:List dataProvider="{xmlData.item}" /&gt; ``` 5. **XML表达式**:Flex...

    flex与PHP数据交互教程

    - 处理返回数据:Flex客户端接收到服务器响应后,解析数据并更新UI。 6. **安全性与优化** - 安全性:确保Flex与PHP之间的通信是安全的,可以使用HTTPS加密传输,同时对服务器端的API进行访问控制和身份验证。 -...

    Flex Demo XML JSON

    例如,你可以使用`new XML(xmlString)`来实例化一个XML对象,然后通过属性和方法如`.attributes`、`.child()`、`.descendants()`等来访问和修改XML数据。 2. **JSON支持**:Flex也内置了对JSON的支持,通过`flash....

    FLEX操作XML&JSON

    2. **解析XML**:加载的XML数据会被存储在`xmlData`变量中,可以通过其属性和方法进行访问。例如,使用`xmlData.firstChild`获取XML文档的第一个子节点。 3. **显示XML数据**:Flex的`&lt;mx:DataGrid&gt;`组件能方便地将...

    Flex基于WebService的数据访问

    本篇文章将深入探讨Flex如何基于WebService进行数据访问。 一、Flex与WebService基础 WebService是一种基于开放标准(如SOAP、WSDL和UDDI)的Web应用程序接口,允许不同系统之间的数据交换。SOAP是传输协议,WSDL是...

    Flex操作XML

    它以其强大的数据可视化和用户界面组件库而闻名,其中XML作为一种常见的数据交换格式,常常被用于Flex应用的数据处理。本篇文章将深入探讨如何在Flex中操作XML,以及如何利用DataSet展示XML数据。 XML(Extensible ...

    Flex中采用Flex-config.xml进行命令行的编译

    在Flex开发中,`flex-config.xml`文件是一个至关重要的配置文件,它允许开发者自定义Adobe Flex编译器的参数和设置。这个文件控制了编译过程中的许多方面,包括优化级别、错误处理、库路径、元数据等。下面将详细...

Global site tag (gtag.js) - Google Analytics