El primero de los problemas que me topé es a la hora de intentar realizar una aplicación que lea de un fichero XML. Para ello, lo primero que se nos viene a la cabeza es utilizar el objeto XML, de esta manera:
<mx:XML id="idObjetoXML" source="ruta/archivo.xml"/>
Si bien funciona en tiempo de desarrollo, el problema estará a la hora utilizarlo en otra ruta distinta a la del entorno de desarrollo, ya que el compilador de Flex incluirá este fichero a nuestro archivo compilado, y las rutas dejarán de funcionar.
Para evitar esto, hemos de usar el objeto HTTPService, usando la ruta del fichero XML como URL, y después asignar el resultado al objeto XML. He aquí el ejemplo.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="getImages.send()"
>
<mx:Script>
<![CDATA[
import mx.rpc.Fault;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
[Bindable]
private var objetoXML:XML;
private function
resultHandler(event:ResultEvent):void
{
objetoXML=event.result as XML;
}
private function
faultHandler(event:FaultEvent):void
{
Alert.show(event.fault.message,
"Error al cargar fichero XML");
}
]]>
</mx:Script>
<mx:HTTPService
id="getImages"
contentType="application/xml"
resultFormat="e4x"
url="ruta/archivo.xml"
method="GET"
useProxy="false"
result="resultHandler(event)"
fault="faultHandler(event)"
/>
...
El objeto "HTTPService" será invocado al crearse la aplicación (evento "creationComplete" del objeto "Application"), y será el encargado de leer el fichero XML. Si el fichero se lee con éxito, se invocará al método "resultHandler", pasando en el parámetro "event" el resultado. En este método, se asignará al objeto de tipo "XML" este resultado en dicho formato. Si hay algún error, se invocará el método "faultHandler".
El segundo problema con el que podemos toparnos es cuando intentamos ejecutar la aplicación en otro entorno distinto al de desarrollo, sobre todo, si se pretende ejecutar en local. La ejecución daría un error del tipo:
faultCode:InvokeFailed faultString:’Error #2148:
SWF file 'ruta/fichero.swf' cannot access local
resource fichero.xml, Only local-with-filesystem
and trusted local SWF files may access local
resources.’
Debido a la seguridad que ofrece Flex, no se puede acceder a ficheros locales. Para saltar esta seguridad, habrá que jugar con los parámetros de compilación.
Para ello, seguir estas instrucciones:
1) En el panel de navegación de Flex Builder, hacer clic derecho sobre el nodo del proyecto.
2) Seleccionar "Properties", con lo que se abrirá el cuadro de diálogo de propiedades del proyecto.
3) En el árbol de la izquierda, seleccionar la opción "Flex compiler"
4) En el campo "Additional compiler", añadir el parámetro "-use-network=false"
El tercero de los problemas llegó a la hora de subirlo al servidor web. A la hora de acceder al fichero xml me daba el siguiente error:
faultCode:Server.Error.Request faultString:
'HTTP request error' faultDetail:'Error:
[IOErrorEvent type="ioError" bubbles=false
cancelable=false eventPhase=2 text="Error #2032:
Error de secuencia. URL: URLruta/archivo.xml"].
URL: URLruta/archivo.xml'
Este error se produce en el objeto HTTPService:
<mx:HTTPService
id="getImages"
contentType="application/xml"
resultFormat="e4x"
url="URLruta/archivo.xml"
showBusyCursor="true"
useProxy="false"
result="resultHandler(event)"
fault="faultHandler(event)"
/>
Aunque en teoría está bien definido, en realidad, el problema lo está dando el atributo "contentType". Ello se resuelve cambiando este atributo por:
contentType="application/x-www-form-urlencoded"
De esta manera, ya funcionará sin problemas.