Xml com somente um filho.

8 views
Skip to first unread message

André Cocuroci

unread,
Oct 21, 2009, 10:02:12 AM10/21/09
to flexdev
Bom dia,

Estou criando um aplicativo onde puxo 3 xmls para popular 2 ComboBox e
BarChart. Estou requisitando eles por HTTPService e no result faço com
que um ArrayCollection receba o resultado desse xml.

Quando esse xml tem vários filhos ocorre tudo bem, porém quando tem
somente um ele dá esse erro:
"TypeError: Error #1034: Falha de coerção de tipo: não é possível
converter ComplexString@211992b1 em mx.collections.ArrayCollection."

O xml está desse jeito:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<regioes>
<regiao id='1'>Norte</regiao>
</regioes>

[Bindable] public var dadosRegiao:ArrayCollection = new ArrayCollection
();

public function resultRegiao(e:ResultEvent):void {
dadosRegiao = e.result.regioes.regiao;
}

NO flex está assim:
<mx:HTTPService url="regiao.xml" id="regiao" showBusyCursor="true"
result="resultRegiao(event)" fault="faultRegiao(event)"
method="GET" />

<mx:ComboBox width="170" id="cbRegiao" prompt="Selecione uma Região"
dataProvider="{dadosRegiao}" change="disparaFiltro(event);"/>

Só funciona quando tem mais um filho. Já tentei mudar a estrutura do
xml para:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<regioes>
<regiao>
<nome>Norte</nome>
</regiao>
</regioes>

Mas dá o mesmo erro, só que ao invéz de:
"TypeError: Error #1034: Falha de coerção de tipo: não é possível
converter ComplexString@211992b1 em mx.collections.ArrayCollection."

Aparece:
TypeError: Error #1034: Falha de coerção de tipo: não é possível
converter mx.utils::ObjectProxy@14824599 em
mx.collections.ArrayCollection.

Gabriela Trindade Perry

unread,
Oct 21, 2009, 10:20:32 AM10/21/09
to flexdev
Um xml sem root é um XMLList

Gabriela Trindade Perry

unread,
Oct 21, 2009, 10:57:39 AM10/21/09
to flexdev

André Cocuroci

unread,
Oct 21, 2009, 11:03:53 AM10/21/09
to flexdev
Obrigado pela dica, vou tentar fazer isso do link que vc me passou,
porém em outro xml com root também tenho o mesmo problema citado
acima:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<detalhes>
<detalhe id='1'>
<estado>PR</estado>
<capital minimo='100'>1500</capital>
<interior minimo='500'>4500</interior>
</detalhe>
</detalhes>

Assim ele tá erro tb.

On 21 out, 12:57, Gabriela Trindade Perry <gabrielape...@hotmail.com>
wrote:
> http://blog.dclick.com.br/2008/09/15/como-transformar-xml-em-arraycol...

Mário Júnior

unread,
Oct 21, 2009, 1:03:16 PM10/21/09
to fle...@googlegroups.com
Opa Andre!!!

Seguinte... a serializaçao (parsing) do XML para Object é feito internamente pelo framework.
Nesse caso, ele faz uma simples verificacao:

Se existe vários nodes com o mesmo nome, dentro da mesma hierarquia, entao ele cria um arraycollection com varios objetos.
Agora, se só exsite UM NODE ele cria um único Objeto e não uma lista de objetos com um elemento.

Entao.. para evitar essa situação de erro no casting, faça o seguinte: (pseudo-codigo, digitado direto aqui, teste para ver se realmente funciona)


// assertCollection é um método que vai tratar o resultado e devolver sempre uma colecao:
private var assertCollection(param : *) : ArrayCollection {
  var result : ArrayCollection;

  if (param is ArrayCollection) { //poderia generalizar com ICollectionView se quiser
    result = param;  //se ja é um arrayCollection, guarda-o no result
 } else {
   result = new ArrayCollection([param]); //adiciona o seu objeto dentro de uma nova colecao
 }

return result; //ira retornar sempre uma colecao.

}


Agora no seu resultHandler vc faz:

private function handleResult(e:ResultEvent):void {
   var minhaColecao : ArrayCollection = assertCollection(e.result);
}


pronto... agora vc SEMPRE terá uma colecao! =D
Ou uma colecao de varios objetos (se o seu xml devolver assim) ou uma colecao com UM Objeto dentro.



Espero ter ajudado, abraços!





2009/10/21 André Cocuroci <cocu...@gmail.com>



--
Mario Junior
Enterprise Java / Flex Architectures
Adobe Certified Expert Flex 3 with AIR

Sofshore Informática
http://www.sofshore.com.br
+55 (48) 3337 2003
Rua Pastor Willian Richard Schisler Filho 452 sl 102, 88034-100 Itacorubi
Florianopolis SC Brasil

cocuroci

unread,
Oct 21, 2009, 6:41:36 PM10/21/09
to fle...@googlegroups.com
Grande Mario,

Obrigado pela dica, ajudou bastante. Consegui o que queria.

Alias, obrigado Gabriela tb pela ajuda.

2009/10/21 Mário Júnior <junin...@gmail.com>
Reply all
Reply to author
Forward
0 new messages