XML HTTPService Результат и для каждого - PullRequest
0 голосов
/ 03 марта 2010

XML - это круто во флексе, но мне надо решить одну досадную проблему, вызванную тем, что я представляю себе как функцию.Видите ли, когда у вас есть только один тег чего-то, он создает объект, который не является массивом.Но когда находит более одного, он помещает его в структуру массива.

Я хочу решить это элегантно.Любая рекомендация.

Пример: это иллюстрирует это, являясь результатом HTTP-запроса:

private function initXMLRes(event:ResultEvent):void
{
    var resObj:Object = event.result;
    //
    for each(var i:Object in resObj.specifictag)
    {
        // to use specifictag attributes, etc. example:
        Alert.show(specifictag.name);
    }
}

Код перед этим будет работать с 2+ элементами.Он примет этот xml:

<specifictag name="one" /><specifictag name="two" />

... но не этот:

<specifictag name="one" />

Я мог бы проверить формат resObj.specifictag (чтобы проверить, имеет ли он массив), а затем продублируйте код (для каждого случая).Но - даже если он вызывает функцию - я не думаю, что это элегантное решение.

Ну, я надеюсь, у кого-то есть хорошая идея по этому вопросу.(По опыту я знаю, что в SO больше экспертов по C ++, чем в flex, но хорошо ...)

Идеально было бы, чтобы HTTPrequest обрабатывал каждый тег согласованно (используя всегда массивы ... хотя яЯ предполагаю, что это также имеет свои недостатки).

Спасибо!

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

Проблема, на мой взгляд, в действительности заключается в ошибке, которую вы можете обработать в своем обработчике результатов HTTPService и заставить возвращаемый объект стать коллекцией массивов. Вот фрагмент моего приложения.

if (evt.result.rows.row is ArrayCollection) {
    MyAC= evt.result.rows.row;
}else{
    MyAC= new ArrayCollection(ArrayUtil.toArray(evt.result.rows.row));
}

Так что это должно работать для вас так:

var resObj:Object = new Object();

if (event.result.rows.row is ArrayCollection) {
    resObj= event.result
}else{
    resObj= new ArrayCollection(ArrayUtil.toArray(event.result));
}
0 голосов
/ 03 марта 2010

Похоже, ваши <specifictag> элементы находятся на верхнем уровне, а не внутри какого-то другого корня? XML-документ может иметь только один корень, поэтому в этом случае вы фактически получаете XML-документ в некоторых случаях и ArrayCollection XML-документов в других случаях. Если вы измените службу так, чтобы она всегда возвращала один контейнер XML с specifictag в качестве дочерних, вам не придется беспокоиться об этой проблеме.

Следующий код демонстрирует, что итерация по одному элементу работает так же, как итерация по нескольким элементам при работе с объектами XML.

private function init():void {
    trace("Iterating two children");
    iterate(<root><child /><child /></root>);
    trace("Iterating one child:");
    iterate(<root><child /></root>);
}

private function iterate(x:XML):void {

    for each(var element:XML in x.child) {
        trace(element.name());
    }
}
0 голосов
/ 03 марта 2010

Это мое текущее решение:

// historial
var hist:ArrayCollection = new ArrayCollection();
if(resObj.hist[0])
  hist = resObj.hist;
else
  hist.addItem(resObj.hist);
...