PDA

Просмотр полной версии : Не получается обратиться к ноду XML


Denisator
14.05.2011, 15:14
Есть вот такой XML:

<battle id1="000" back_url="res/back/lava.jpg" battle_type="blood" timeout="30000">
<left id1="000" type="male" nick="Denisator" clan_name="Stalkers" clan_emblema_url="res/clan_emblema/stalkers.gif">
<stats level="10" health="100" strength="5"/>
<ammunition>
<head name="Шлем Хаоса" head_url="res/ammunition/head/chaos_helm.png">Сила +100\n Ловкость +30</head>
<hands></hands>
<hooks></hooks>
<body></body>
<legs></legs>
<foot></foot>
<weapon></weapon>
<shield></shield>
</ammunition>
</left>
<right id="001" type="male" name="Xflat" clan_name="Stalkers" clan_emblema_url="res/clan_emblema/stalkers.gif">
<stats level="10" health="100" strength="5"/>
<ammunition>
<head name="Шлем Хаоса" head_url="res/head/chaos_helm.png">Сила +100\n Ловкость +30</head>
<hands></hands>
<hooks></hooks>
<body></body>
<legs></legs>
<foot></foot>
<weapon></weapon>
<shield></shield>
</ammunition>
</right>
</battle>


К ноду battle получается обратиться и вытащить свойства, а к более глубоким узлам никак не получается обратиться. Объясните, пожалуйста, что я делаю не правильно.


var flooring:XML = new XML(data);
flooring.ignoreWhite = true;

_root.back = flooring.firstChild.attributes.back_url;
_root.helm = flooring.firstChild.firstChild.attributes.clan_emblema_url;
trace(_root.back); // трейс выдаёт "res/back/lava.jpg"
trace(_root.helm); // трейс выдаёт "undefined"

mooncar
14.05.2011, 15:26
Верно вроде.
У меня
trace(_root.helm)
выдает
res/clan_emblema/stalkers.gif

Но. Я проверяю с учетом асинхронности загрузки по отношению к выполнению кода, а у вас я этого не наблюдаю. Сделайте так и вы:
var xmlData:XML = new XML();
xmlData.ignoreWhite = true ;
xmlData.onLoad = loadXML;
xmlData.load('config.xml');

function loadXML (success:Boolean)
{
if (success)
{
var mainNode:XMLNode = this.firstChild ;
_root.back = mainNode.attributes.back_url;
_root.helm = mainNode.firstChild.attributes.clan_emblema_url;
trace(_root.back);
trace(_root.helm);
}
else
{
message_tf.text = 'Ошибка связи\nс конфигуратором данных xml';
}
}

Denisator
14.05.2011, 19:50
Асинхронность у меня учитывалась, но я её при цитировании кода убрал.


var lvSend:LoadVars = new LoadVars();
var lvReceive:LoadVars = new LoadVars();
lvSend.command = 'getBattleInf';
lvReceive.onData = function(data) {
//trace(data);
_root.loading._visible = false;
if (data == null) {
_root.textbox.text = 'error';
} else {
var flooring:XML = new XML(data);
//_root.textbox.text = data;
flooring.ignoreWhite = true;
// По окончанию загрузки выводим содержимое XML документа
_root.back = flooring.firstChild.attributes.back_url;
_root.helm = flooring.firstChild.firstChild.attributes.clan_emblema_url;
trace(_root.back);
trace(_root.helm);
play();
}
};
lvSend.sendAndLoad("battle.xml",lvReceive,'POST');
stop();

mooncar
14.05.2011, 20:20
Тем не менее, сам парсинг у вас верный...
А что трейс показывает?

....
var flooring:XML = new XML(data);
trace(flooring);
...

И кстати, вы отправляете POST'ом данные, они у вас там обрабатываются как-то? Какой-то скрипт отдает battle.xml?

Denisator
14.05.2011, 20:22
Трейс показывает именно то что я написал в первом посте.
trace(_root.back); // трейс выдаёт "res/back/lava.jpg"
trace(_root.helm); // трейс выдаёт "undefined"
Тоесть первый нод показывает, а следующий нет.

И кстати, вы отправляете POST'ом данные, они у вас там обрабатываются как-то? Какой-то скрипт отдает battle.xml?
Пока я побращаюсь локально к battle.xml, однако потом я собираюсь получать XML от пхп скрипта которому я также мог бы слать флэшем команды.

mooncar
14.05.2011, 20:30
flooring.ignoreWhite = true ;
trace(flooring);
Посмотреть, какой XML получается из полученной строки, весь.
Там должно выводится все, что в первом посте у вас. Нормально с этим, без обрывов?

Добавлено через 6 минут
И все же, попробуйте мою схему, если заработает, след. шагом попробуете перевести на скрипт.

Denisator
14.05.2011, 20:47
flooring.ignoreWhite = true ;
trace(flooring);
Посмотреть, какой XML получается из полученной строки, весь.
Там должно выводится все, что в первом посте у вас. Нормально с этим, без обрывов?

Поставил трейс, он выдал:

<battle id1="000" back_url="res/back/lava.jpg" battle_type="blood" timeout="30000">
<left id1="000" type="male" nick="Denisator" clan_name="Stalkers" clan_emblema_url="res/clan_emblema/stalkers.gif">
<stats level="10" health="100" strength="5" />
<ammunition>
<head name="Шлем Хаоса" head_url="res/ammunition/head/chaos_helm.png">Сила +100\n Ловкость +30</head>
<hands />
<hooks />
<body />
<legs />
<foot />
<weapon />
<shield />
</ammunition>
</left>
<right id="001" type="male" name="Xflat" clan_name="Stalkers" clan_emblema_url="res/clan_emblema/stalkers.gif">
<stats level="10" health="100" strength="5" />
<ammunition>
<head name="Шлем Хаоса" head_url="res/head/chaos_helm.png">Сила +100\n Ловкость +30</head>
<hands />
<hooks />
<body />
<legs />
<foot />
<weapon />
<shield />
</ammunition>
</right>
</battle>


Попробовал Ваш код и он всё правильно выдаёт. Но я не знаю как его перевести на работу со скриптом.

mooncar
14.05.2011, 20:54
Вместо
xmlData.load('battle.xml');
запиши что-то вроде
xmlData.load('battle.php?command=getBattleInf');
То есть battle.php отдавать должен будет строку XML-ную, а вот принимать данные GET'ом, то есть в его начале такая строка будет:
$command = !_GET['command'];
Другого решения сейчас в голову не приходит, с POST'ом, может кто подскажет. Вообще, у XML есть метод XML.sendAndLoad, может быть подойдет, я его сам не смотрел.

Denisator
14.05.2011, 21:03
Спасибо, Луноход.
Буду делать по твоему способу.