P. 1
24_XML con E4X

24_XML con E4X

|Views: 114|Likes:
Published by Carmelo

More info:

Published by: Carmelo on Nov 09, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PPTX, PDF, TXT or read online from Scribd
See more
See less

11/09/2010

pdf

text

original

Flex 4

XML con E4X

‡ Ob jetivo
± Modificar y acceder a datos con formato XML

‡ EcmaScript para XML (E4X) es una de estas herramientas. ‡ Implementado como parte de AS3 ‡ Cualquier aplicación en Flash Player 9 o superior accede a la API E4X y puede usar su sintaxis para parsear, extraer datos y modificar objetos XML y XMLList almacenados en memoria.

XML
<?xml version= 1.0 ?> <invoices> <invoice> <customer>Smith, Maria</customer> <items> <lineitem price= 21.41 quantity= 4 >Widget</lineitem> <lineitem price= 2.11 quantity= 14 >Mouse</lineitem> <lineitem price= 8.88 quantity= 3 >Wrench</lineitem> </items> </invoice> </invoices>

Acceso sin E4X
var arItems:Array= xmlDocument.firstChild.firstChild.childNodes[1].childNodes; var arResult:Array = new Array(); for (var i:int=0; i<xInvoices.length; i++) { var currentNode:XMLNode = arItems[i] as XMLNode; if (currentNode.attributes.price == 21.41 ) { arResult.push(currentNode) } }

Acceso con E4X
‡ var xResult:XMLList = xInvoices..lineitem.(@price=21.41);

Clases en AS3 para gestionar XML
‡ XML.
± clase que soporta expresiones E4X para parsear y modificar datos en tiempo de ejecución. ± Sólo tiene un nodo root

‡ XMLList.
± representa un orden establecido de objetos XML ± es similar a Array que contiene objetos en un orden fijado. ± NO tiene un API completa para manejar, modificar y ejecutar bindings cuando sus datos cambian en tiempo de ejecución

‡ XMLListCollection.
± clase envolvente que gestiona ArrayList ± Igual que AC ofrece ordenar, filtrar y otras características avanzadas para gestionar Array, el XMLListCollection implementa un poderoso API que gestiona un XMLList y ejecuta bindings cuando los datos cambian en tiempo de ejecución.

Declarar objeto XML en MXML
<fx:XML format= e4x id= xmlData > <sales> <item type= apples price= 4.53 quantity= 6 /> <item type= oranges price= 3.35 quantity= 10 /> <item type= pears price= 5.16 quantity= 3 /> </sales> </fx:XML>

Importar XML con HTTPService
‡ La propiedad resultFormat del componente HTTPService puede ser e4x y representa como un objeto XML los datos recibidos. <s:HTTPService id= salesService url= data/sales.xml resultFormat= e4x result= resultHandler(event) />

‡ En la función manejadora de event result podemos capturar los datos devueltos como un objeto XML private var xmlData:XML; private function resultHandler(event:ResultEvent):void { xmlData = event.result as XML; }

Clase XMLListCollection
‡ Podemos instanciar e inicializar un objeto XMLListCollection y asociarlo a un XMLList
± Asignamos el XMLList a la propiedad source
‡ ‡ ‡ ‡

[Bindable] private var xCollection:XMLListCollection = new XMLListCollection(); xCollection.source = xmlList;

± Pasamos el XMLList a XMLListCollection con el método constructor
‡ [Bindable] ‡ private var xCollection:XMLListCollection = ‡ new XMLListCollection(xmlList);

± Declaramos el XMLListCollection en MXML y asignamos source con el atributo de una binding expression
‡ <s:XMLListCollection id= xCollection source= {xmlList} />

Expresiones E4X
‡ Las expresiones E4X pueden llamarse sólo desde XML o XMLList, NO desde XMLListCollection ‡ XMLListCollection se utiliza para representar el resultado final y pasarlo a un control visual

Fichero XML
‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ <?xml version= 1.0 ?> <invoices> <invoice> <customer> <firstname>Maria</firstname> <lastname>Smith</lastname> </customer> <items> <lineitem price= 21.41 quantity= 4 >Widget</lineitem> <lineitem price= 2.11 quantity= 14 >Mouse</lineitem> <lineitem price= 8.88 quantity= 3 >Wrench</lineitem> </items> </invoice> <invoice> <customer> <firstname>John</firstname> <lastname>Jones</lastname> </customer> <items> <lineitem price= 7.41 quantity= 84 >Mouse</lineitem> <lineitem price= 0.91 quantity= 184 >Mousepad</lineitem> </items> </invoice> </invoices>

notación punto
‡ Un objeto AS creado desde un XML se refiere a la estructura del elemento root, no al documento XML. ‡ Si un componente HTTPService importa el documento XML anterior y pasa el objeto ResultEvent a una función manejadora, la expresión event.result se refiere al elemento <invoices> ‡ Guardamos entonces, los datos devueltos en una variable de tipo XML y usamos expresiones E4X para extraer los datos que necesitamos.

[Bindable] private var xInvoices:XML; private function resultHandler(event:ResultEvent):void { xInvoices = event.result as XML; }

‡ Comenzando por el elmento root, recorremos la jerarquía XML nivel por nivel usando el . ‡ Para extraer todos los elementos llamados <invoice> que son child de root
± xReturn = xInvoices.invoice;

Usando notación Array
‡ Si dos elementos o más tienen el mismo nombre en el mismo nivel de la jerarquía XML nos referimos a ellos como elementos Array.
± xReturn = xInvoices.invoice[1];

‡ Tras encontrar el elemento usando la notación Array, podemos bajar en la jerarquía usando el punto de nuevo.
± xReturn = xInvoices.invoice[0].customer

..
‡ Un solo . busca el hijo directo ‡ Si usamos .. nos permite buscar todos los elementos del mismo nombre independiente de su posición o qué elementos padre tenemos entre ellos. ‡ Este código extrae todos los <customer> independiente de su posicion
± xReturn = xInvoices..customer;

‡ Cuando una expresión E4X no encuentra resultados devuelve un objeto nulo o undefined. ‡ Así se devuelve un objeto XMLList vacio. ‡ Podemos controlar los resultados:
if (xReturn.length() == 0) { errorMessage = No XML nodes were found ; }

Filtrar datos XML
‡ Podemos filtrar datos en un objeto XML como usando la clausula WHERE de SQL. ‡ Añadimos la expresión que indica los que queremos devolver separada con un operador
xReturn = xInvoices..customer.(lastname== Jones )

‡ También podemos filtrar valores almacenados como texto en los nodos. ‡ ‡ ‡ ‡ ‡ <items> <lineitem price= 21.41 quantity= 4 >Widget</lineitem> <lineitem price= 2.11 quantity= 14 >Mouse</lineitem> <lineitem price= 8.88 quantity= 3 >Wrench</lineitem> </items>
± xReturn = xInvoices..lineitem.(toString()== Mouse );

‡ Podemos tb filtrar por atributos
xReturn = xInvoices..lineitem.(@price < 8);

‡ Podemos ver ejemplos del capitulo 24
± E4XParsing.mxml ± E4XParsingHelper.as

Modificar datos en XML
‡ Tb podemos usar expresiones E4X para añadir, eliminar y modificar elementos en un objeto XML

Cambiar valores existentes
± xInvoices.invoice[0].customer.firstname= Harry ;

‡ Tb podemos modificar valores de atributos usando @
xInvoices.invoice[0].items.lineitem[0].@price=12.50;

Añadir elementos y atributos
‡ Si el nodo no existe, lo crea automáticamente.
xInvoices.invoice[0].customer.city= Seattle ; xInvoices.invoice[0].items.lineitem[0].@inStock=true

Eliminar elementos y atributos
‡ El operador delete se usa para eliminar datos del XML en tiempo de ejecución.
± delete xInvoices.invoice[1]; ± delete xInvoices.invoice[0].items.lineitem; ± delete xInvoices.invoice[0].items.lineitem[0].@quantity;

Ejemplos
‡ E4XChanging.mxml ‡ E4XPChangingHelper.as

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->