PDA

Просмотр полной версии : Из XML в dataGrid и обратно


Atomnsq
15.08.2018, 23:01
Подскажите пожалуйста как можно реализовать возможность редактирования XML файла через dataGrid.
Есть XML который выгружается в dataGrid. Пытаюсь сделать так чтобы все внесенные изменения в записались в XML.
Содержимое файла *.fla.

/*импорт классов*/
import fl.controls.DataGrid;
import fl.controls.dataGridClasses.DataGridColumn;
import fl.data.DataProvider;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.*;

/*загрузка XML-файла*/
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("table.xml"));
loader.addEventListener(Event.COMPLETE,onComplete);

/*функция, которая выполняется после успешной загрузки XML-файла*/
function onComplete(event:Event):void
{
/* переменная, хранящая XML-файл */
var myxml:XML = XML(event.target.data);

/* создаём столбец "Имя" */
var users:DataGridColumn = new DataGridColumn("name");//создаём столбец и в качестве параметра указываем имя столбца
users.headerText = "Имя";//заголовок столбца
users.width = 150;//ширина столбца

/* создаём столбец "Очки" */
var scores:DataGridColumn = new DataGridColumn("score");//создаём столбец и в качестве параметра указываем имя столбца
scores.headerText = "Очки";//заголовок столбца
scores.width = 100;//ширина столбца

/* создаём поставщика данных на основе ранее загруженного XML-документа*/
var dp:DataProvider = new DataProvider(myxml);

/* создаём компонент DataGrid */
var dg:DataGrid = new DataGrid();
addChild(dg);//добавляем в список отображения
dg.x = 150;//позиционируем по оси X
dg.y = 100;//позиционируем по оси Y
dg.width = 250;//ширина таблицы
dg.headerHeight = 40;//высота заголовка таблицы
dg.rowHeight = 30;//высота строк в таблице
dg.columns = [users,scores];//указываем столбцы для нашей таблицы
dg.dataProvider = dp;//источник данных для таблицы
dg.rowCount = dg.length;//число строк, видимых в таблице
dg.editable = true;

for (var q:int = 0; q < myxml.length();q++)
{
trace((myxml));
}
//trace(event.target.data);
}


Содержимое файла *.xml

<?xml version="1.0" encoding="UTF-8" ?>
<table>
<user name="Елена" score="1"></user>
<user name="Ирина" score="2"></user>
<user name="Наталья" score="3"></user>
</table>

GBee
15.08.2018, 23:41
Пытаюсь сделать так чтобы все внесенные изменения в записались в XML.
Где пытаетесь?

Atomnsq
16.08.2018, 13:03
Где пытаетесь?


Судя по коду пока негде. Вот и хотелось узнать куда писать и что.

Запись в файл организовал через FileStream. Понял что реализовать нужно было через AIR.
Для примера записывал уже редактированные значения в другой файл XML.
Добавил код:

//Редактируем XML содержимое // для теста
var outXML:XML = new XML ;
for (var i:int = 0; i < myxml.children().length(); i++)
{
trace(myxml.user[i].@name);

//изменяем нужные нам значения
myxml.user[0]. @ name = "Екатерина";
myxml.user[1]. @ name = "Анастасия";
myxml.user[2]. @ name = "Ольга";
}

//Сохраняем в изменения в другой файл//
var outFile:File = File.applicationStorageDirectory;
outFile = outFile.resolvePath("D:/XMLtoDG/tableOut.xml");

var outStream:FileStream = new FileStream();
outStream.open(outFile, FileMode.WRITE);
outStream.writeUTFBytes(myxml);
outStream.close();


Не могу понять как обратиться к dataGrid чтобы выгрузить данные с него и привести в приемлемый вид для сохранения в XML.
Предполагаю что нужно использовать какой-нибудь слушатель dataGrid.
Примерно что то типа:

dg.addEventListener(???,имя функии);

Правильно я думаю или нет?

P.S. Наверное по тому что я пишу в кадре и так понятно что я новичок в AS3.

GBee
16.08.2018, 14:36
Короче, я не очень люблю работать с чистым хмл, хотя иногда удобно. Но я бы поступил попроще.
Сконвертил бы хмл в массив типизированных объектов
Массив отдал бы как датапровайдер. И насколько помню - dg.editable = true; подразумевает двусторонний биндинг. Так что после редактирования в массиве будут измененные данные.

То есть тупо потом конвертим массив обратно в хмл. И сохраняем куда хотим.


С другой стороны по идее в dg.dataProvider содержит тоже измененные данные после редактирования. Но это надо дебажить. ХМЛ любит почковаться на каждое телодвижение.