PDA

Просмотр полной версии : [AS3]Как конвертировать XML в массив


Exey
14.08.2006, 18:01
Есть XML:


<items>
<item>
<title>Название работы 1</title>
<date>2006-02-06</date>
</item>
<item>
<title>Название работы 2</title>
<date>2005-10-07</date>
</item>
<item>
<title>Название работы 3</title>
<date>2005-09-07</date>
</item>
</items>


Как из него получить такой массив?:


[
{title: 'Название работы 1', date: '2006-02-06'},
{title: 'Название работы 2', date: '2005-10-07'},
{title: 'Название работы 3', date: '2005-09-07'}
]

etc
14.08.2006, 18:27
А чем тебя не устраивает сам XML? Зачем менять структуру?

Nirth
14.08.2006, 18:37
причем тут FLEX?
перенес в раздел для новичков, раз пользователь не знает как слово "парсинг"

Exey
14.08.2006, 18:53
А чем тебя не устраивает сам XML? Зачем менять структуру?

Устраивает... просто, я не нашел другого способа програмно отсортировать поля DataGrid.


Динамически наполняю DataGrid несколькими подобными ХML'ами, и поля перед показом нужно отсортировать по дате


<mx:Script>
<![CDATA[
...
loadXML('how/id.xml');
loadXML('how/card.xml'); // гружу несколько XML ...
how1Filter = myXML2..item; // XMLList для DataGrid

]]>
</mx:Script>

<mx:DataGrid id="how1Grid" dataProvider="{how1Filter}" >
<mx:columns>
<mx:DataGridColumn dataField="title" headerText="title"/>
<mx:DataGridColumn dataField="date" headerText="date" />
</mx:columns>
</mx:DataGrid>



Узнал что в 1.5 был SortItemsBy(); , в двойке нет такого, по хелпу ("Sorting data in DataGrid controls") :(

Exey
15.08.2006, 14:03
причем тут FLEX?
перенес в раздел для новичков, раз пользователь не знает как слово "парсинг"

Слово знаю, пользоватся не научусь никак...
во Флексе знаю два способа импортирования XML:
1) HTTPService
2) URLLoader

Вот пробую первым , почему он мне трэйсит не массив а тот же XML?



<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="dsWorks.send();">

<mx:Script><![CDATA[
import mx.collections.XMLListCollection;
import mx.rpc.events.ResultEvent;
import mx.utils.ArrayUtil;
public var XML2Array:Array;

private function onResult(oEvent:ResultEvent):void
{
var xlcDP:XMLListCollection = new XMLListCollection(oEvent.result.item);
XML2Array = ArrayUtil.toArray(xlcDP);
trace(XML2Array);
}//onResult

]]></mx:Script>
<mx:HTTPService id="dsWorks" url="assets/card.xml" result="onResult(event)" resultFormat="e4x"/>

</mx:Application>

wvxvw
15.08.2006, 14:56
А нельзя никак передавать значения в атрибутах? Зачем плодить лишние узлы, да еще и текстовые?

Nirth
15.08.2006, 15:28
можно открыть поиск и ввести слова "парсинг XML" и не парится и ждать ответа=)

Exey
15.08.2006, 17:00
можно открыть поиск и ввести слова "парсинг XML" и не парится и ждать ответа=)

нашел топик Оптимизация разбора ХМЛ (http://flasher.ru/forum/showthread.php?t=70447&highlight=%EF%E0%F0%F1%E8%ED%E3)

там:


...
в 99 процентах случаев нужно работать с XML.
...
Абсурдно удалять то, что помогает работать с данными.


В моем случае то же? (динамически собираю XMLList, не могу остортировать :rtfm:)
Если да, то подскажи как отсортировать узлы <item>...</item> по дате которая в <item><date>...</date></item> .

Exey
15.08.2006, 17:15
А нельзя никак передавать значения в атрибутах?

Рад бы... незнаю как?

Зачем плодить лишние узлы, да еще и текстовые?

Мне нужно наполнить осортированными узлами:

<mx:DataGrid>
<mx:columns>
<mx:DataGridColumn dataField="title" headerText="title"/>
<mx:DataGridColumn dataField="date" headerText="date" />
</mx:columns>
</mx:DataGrid>

Есть ли методы у DataGrid или DataGridColumn, чтобы выводить поля в порядке убывания даты?

wvxvw
16.08.2006, 03:00
Есть XML:


<items>
<item>
<title>Название работы 1</title>
<date>2006-02-06</date>
</item>
<item>
<title>Название работы 2</title>
<date>2005-10-07</date>
</item>
<item>
<title>Название работы 3</title>
<date>2005-09-07</date>
</item>
</items>



Привести к виду
<items>
<item title="Название работы 1" date="2005-09-07"/>
<item title="Название работы 2" date="2005-08-07"/>
<item title="Название работы 3" date="2005-06-07"/>
</items>
а потом через nextSibling просматривать атрибуты и генерить другой ХМЛ в зависимости от значения атрибута... Есть такая ф-ция как insertBefore(); проверяем циклом нужный аттрибут, если значение больше - добавляем узел после, если меньше - до... это самое первое, что приходит в голову..

ЗЫ. да или такой вариант, пожалуй даже проще. Прочитываем значения нужного атрибута, формируем последовательность добавления - по ней генерим новый ХМЛ из старого =) Ща попробую сделать пример.

Nirth
16.08.2006, 15:11
а почему бы не юзать E4X раз уж дело всеравно в ActionScript 3.0 и не парится?

Exey
21.08.2006, 19:10
Оказалось можно сортить XMLListCollection, потому что он расширяет ListCollectionView.


// how1Filter - это XMLList, переменные определы как [Bindable]
how1FilterList = new XMLListCollection( how1Filter );

var sort:Sort = new Sort();
sort.fields = [new SortField("date", true, true)];
how1FilterList.sort = sort;
how1FilterList.refresh();


Спасибо за помощь :yahoo: