PDA

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


shmblra
27.05.2011, 11:48
Уважаемые форумчане, помогите разобраться.

Все ни как не могу разобраться как работать с xml

Задача в следущем:
1. создание xml
2. загрузить его во флеш
3. создать и добавить данные из xml в массив объектов.

мои действия:

1. XML структура:
<?xml version="1.0" encoding="utf-8"?>
<games>
<level id="1" small="images/small_1.jpg" big="images/big_1.jpg">
<tags id="1" obj="некий объект" text="некий текст"></tags>
<tags id="2" obj="некий объект" text="некий текст"></tags>
</level>
<level id="2" small="images/small_2.jpg" big="images/big_2.jpg">
<tags id="1" obj="некий объект" text="некий текст"></tags>
<tags id="2" obj="некий объект" text="некий текст"></tags>
</level>
<level id="3" small="images/small_3.jpg" big="images/big_3.jpg">
<tags id="1" obj="некий объект" text="некий текст"></tags>
<tags id="2" obj="некий объект" text="некий текст"></tags>
</level>
</games>

2. загружаю его во флеш:
class action.rad.all.Game extends MovieClip {

private var gameArray:Array;

public function Game() {

gameArray = new Array();

var xmlData:XML = new XML();
xmlData.ignoreWhite = true;
xmlData.onLoad = loadXML;
xmlData.load('xml/myxml.xml');

function loadXML (success:Boolean)
{
if (success){
var node:XMLNode = this.firstChild ;
var total:Number = node.childNodes.length ;
for(var i:Number = 0; i < total; i++){
var fName:String = node.childNodes[i].attributes['small'];
trace(fName);

gameArray[i] = fName; - выводлит undefine - не могу понять почему
//gameArray.push(fName) - выводит так же undefine
}
}else {
trace ('Ошибка при загрузке xml');
}

trace ('gameArray: ' + gameArray);
}
}
}


Проблема в том, что я не знаю как добавить элементы в массив и по мимо всего прочего у каждого тега level есть дочерние элементы, как создать массив объектов примерно такого типа из этой структуры


someObject[0]
{
obj.id = level_id
obj.small = level_small
obj.big = level_big
obj.tags = level.tags.id = i (их же может быть неограниченное колличество)
}
someObject[1]
{
obj.id = level_id
obj.small = level_small
obj.big = level_big
obj.tags = level.tags.id = i (их же может быть неограниченное колличество)
}
и так далее


я запутался уже с xml ...

dark256
27.05.2011, 15:01
attributes.small

Дочерние - вставьте еще один цикл и:

node.childNodes[i].childNodes[j].attributes

shmblra
27.05.2011, 16:12
а в массив не добавляет ...

немного переделал структуру, при помощи callBack функции

а вот как теперь построить массив объектом ?
class action.rad.all.Game extends MovieClip {


private var xmlData:XML;
private var gameObject:Object;

//Конструктор Класса
public function Game() {

xmlData = new XML();
xmlData.ignoreWhite = true;
xmlData.onLoad = callBack (this, loadXML);
xmlData.load('xml/myxml.xml');

}
//Функция разбора XML, создает Массив Объектов.
private function loadXML (success:Boolean) {

if (success) {
var node:XMLNode = xmlData.firstChild ;
var total:Number = node.childNodes.length ;

for (var i:Number = 0; i < total; i++) {

var pp:XMLNode = node.childNodes[i];
if (pp.nodeName == 'level') {

trace ('small: ' + pp.attributes.small);
trace ('big: ' + pp.attributes.big);

for (var j:Number = 0; j < pp.childNodes.length; j++) {

var zz:XMLNode = pp.childNodes[j];
if (zz.nodeName == 'tags') {

trace ('obj: ' + zz.attributes.obj);
trace ('text: ' + zz.attributes.text);
}
}
}
trace ('----------------');
}
}else {
trace ('Ошибка при загрузке xml');
}
}
//Возвращает функцию. Влияет на область видимости
private function callBack (scope, func, par):Function {
return function () {
if (par != undefined ) {
func.call(scope, arguments, par);
} else {
func.call(scope, arguments);
}
}
}
}