Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Чтение XML. Методы text() и elements() (http://www.flasher.ru/forum/showthread.php?t=122663)

Elandor 16.03.2009 00:02

Чтение XML. Методы: text(), elements(), children(), nodeKind()
 
Всем доброго времени суток.

Есть некий XMLList:
Код:

<span>str1</span>
str2
<span>str3</span>
<span>str4</span>
str5
...

который нужно последовательно обойти, то есть после обработки "<span>str1<span>" перейти к "str2", а не к следующему span'у.

Теперь собственно вопрос, как это можно реализовать? Через методы elements() и text() можно получить доступ либо к одному, либо к другому.

У меня есть идея с предварительным обходом XMLList и составлением "очереди"... но она скорее всего получится неприлично громоздкой (по крайней мере в моей реализации)). Уверен, что есть очень простое решение, но голова уже мало что соображает. Прошу хотя бы намекнуть что и в каком направлении искать.

Заранее благодарен.

serenkiy 16.03.2009 00:15

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

wvxvw 16.03.2009 00:59

Код AS3:

var xml:XML =
<data>
        <span>str1</span>
        str2
        <span>str3</span>
        <span>str4</span>
        str5
</data>;
xml.*.(nodeKind() == "text" ?
                trace("this is text: ", toXMLString()) :
                trace("not text: ", toXMLString()));


serenkiy 16.03.2009 01:11

скорее всего нужно проверять (nodeKind() != null). Касательно этой темы могу порекомендовать книгу "ActionScript 3.0. Сборник рецептов", она продается в многих магазинах (ну или можно поискать сканы в интернете). Там касательно вашей проблемы выделена целая глава. Там Вы так же для себя узнаете много интересных "фишек" касательно работы с XML. Написано все очень грамотно и понятно, подчерпнете много интересной информации на будущее :)

wvxvw 16.03.2009 01:15

>> скорее всего нужно проверять (nodeKind() != null).
Надеюсь, что в этой книге ничего подобного не написано...
1. проверять на нестрогое неравенство с null - это уже абсурдно само по себе.
2. nodeKind() не может возвращать null ни при каких обстоятельствах... вы хоть в мануал загляните, перед тем, как советовать.

serenkiy 16.03.2009 02:14

Согласен, это абсурд полнейший и в книге Вы такого не найдете. На самом деле я опечатался, параллельно думал о hasSimpleContent(), hasComplexContent() и прочих методах, в рез-те получился такой бред. Сейчас протестирую один подход, если получится, опубликую рез-т.

Добавлено через 40 минут
Код AS3:

private function getData(node:XML):void {
        for (var i:int = 0; i < node.children().length(); i++) {
                trace(node.children()[i]);
        }
}

Для Вашего XML документа будет след. результат:
Код:

str1
str2
str3
str4
str5


Elandor 16.03.2009 17:52

Ночью таки дописал вариант с "очередью". Днём дошло, что есть ещё children() - быстренько исправил код, пока никто не заметил :rolleyes:

А вот с nodeKind() ни разу ещё работать не приходилось, буду знать.

serenkiy, wvxvw
Ещё раз спасибо.

P.S.: если имелась в виду книжка за авторством Лотта, Шалла и Питерса, то есть такая. Иногда к ней обращаюсь, если в хелпе чего не понятно)

Подправил название темы.


Часовой пояс GMT +4, время: 06:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.