Pergunta

Estou tendo problemas para fazer o loop manual dos dados xml recebidos por meio de uma chamada HTTPService. O xml é mais ou menos assim:


<DataTable>
    <Row>
        <text>foo</text>
    </Row>
    <Row>
        <text>bar</text>
    </Row>
</DataTable>

Quando o evento de resultado do webservie é acionado, faço algo assim:


for(var i:int=0;i<event.result.DataTable.Row.length;i++)
{
    if(event.result.DataTable.Row[i].text == "foo")
        mx.controls.Alert.show('foo found!');

}

Este código funciona, então há mais de 1 nó "Linha" retornado, no entanto, parece que se houver apenas um nó "Linha", o objeto event.DataTable.Row não é um erro e o código quebra posteriormente.

Qual é a maneira correta de percorrer o objeto de resultado HTTPService?Preciso convertê-lo em algum tipo de coleção XMLList ou ArrayCollection?Tentei definir o resultFormat como "e4x" e isso ainda não resolveu o problema...

Obrigado

Foi útil?

Solução

O problema está nesta afirmação

event.result.DataTable.Row.length

length não é propriedade de XMLList, mas um método:

event.result.DataTable.Row.length()

é confuso, mas é assim que as coisas são.

Adição: na verdade, a coisa mais segura a fazer é sempre usar um for each loop ao iterar XMLLists, assim você nunca comete erros, tem menos código e é mais fácil de ler:

for each ( var node : XML in event.result.DataTable.Row )

Outras dicas

Row não é uma matriz, a menos que haja vários elementos Row.É irritante.Você tem que fazer algo assim, mas eu não escrevo AS3 há algum tempo, então esqueço se existe uma função.

if (exists(event.result.DataTable) && exists(event.result.DataTable.Row)){
  if (exists(event.result.DataTable.Row.length)) {
    for(var i:int=0;i<event.result.DataTable.Row.length;i++)
    {
        if (exists(event.result.DataTable.Row[i].text)
        && "foo" == event.result.DataTable.Row[i].text)
            mx.controls.Alert.show('foo found!');
    }
  }
  if (exists(event.result.DataTable.Row.text)
  && "foo" == event.result.DataTable.Row.text)
      mx.controls.Alert.show('foo found!');
}

Eu o armazenaria em um objeto Xml e usaria seus métodos para procurar o valor do nó necessário.

var returnedXml:Xml = new Xml(event.result.toString());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top