Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обращение к элементам XML (http://www.flasher.ru/forum/showthread.php?t=213606)

ZackMercury 18.11.2016 16:07

Обращение к элементам XML
 
representation.xml
Код:

<?xml version="1.0" encoding="UTF-8" ?>
<representation>
        <circle></circle>
        <shape>
                <point id="1"/>
                <point id="2"/>
        </shape>
        <line></line>
</representation>

Код AS3:

private function representationFileLoaded(e:Event):void 
{
        this._representation = XML(this._urlLoader.data);
        for each (var property:XML in this._representation)
        {
                trace(property)
        }
}

->
https://pp.vk.me/c638317/v638317943/...kdNu_Q6cRg.jpg

Код AS3:

private function representationFileLoaded(e:Event):void 
{
        this._representation = XML(this._urlLoader.data);
        trace(this._representation.representation);
}

->
https://pp.vk.me/c638317/v638317943/...2PdAspuVQo.jpg

Код AS3:

private function representationFileLoaded(e:Event):void 
{
        this._representation = XML(this._urlLoader.data);
        trace(this._representation.circle);
}

->
https://pp.vk.me/c638317/v638317943/...2PdAspuVQo.jpg

Код AS3:

private function representationFileLoaded(e:Event):void 
{
        this._representation = XML(this._urlLoader.data);
        trace(this._representation..representation);
}

->
https://pp.vk.me/c638317/v638317943/...2PdAspuVQo.jpg



Как мне обращаться к отдельным элементам иерархии, если не так?
Мне нужно пройтись по детям representation, чтобы создать экземпляры соответствующих классов.

Wolsh 18.11.2016 19:04

1) <representation/> это корневой тэг XML, то есть сам XML. У него нет свойства (вложенной ноды) .representation — он сам и есть эта нода.
То есть <representation/> это this._representation;
2) Нода <circle></circle> пустая, какого вывода Вы ожидаете? Обращение правильное, хотя противоречит логике попыток выше)))
3) Обращение через две точки означает (грубо говоря) "искать на всех уровнях вложенности". В случае с <representation/> оно никак не поможет)) Вот если нужно обратиться к свойствам шейпа то да: trace(this._representation..point[0].@id);

ZackMercury 18.11.2016 19:40

А разве если это корневой тег XML, то, имея несколько детей, тег не должен быть XMLList?

Цитата:

2) Нода <circle></circle> пустая, какого вывода Вы ожидаете? Обращение правильное, хотя противоречит логике попыток выше)))
При выводе всего XML, оно выводит весь код XML, включая корневой тег, значит, следуя логике, при обращении к ребёнку, оно должно вывести не его содержимое, а конкретно тег+содержимое.

Да, действительно, вот так выводится "1"
Код AS3:

private function representationFileLoaded(e:Event):void 
{
        this._representation = XML(this._urlLoader.data);
        trace(this._representation.shape.point[0].@id)
}

Спасибо.
А как пройтись по детям корневого элемента, попытка, взятая из примера в документации, которая идёт первым делом в шапке выводит почему-то весь документ?
Решил используя метод children(). Извиняюсь, хреново просмотрел документацию.

Wolsh 19.11.2016 00:45

Цитата:

Сообщение от ZackMercury (Сообщение 1197438)
А разве если это корневой тег XML, то, имея несколько детей, тег не должен быть XMLList?

XMLList это Коллекция, то есть простой Список, в котором не предполагается отношение элементов списка как Родитель-Ребенок. У самих элементов списка конечно могут быть свои дети, а так же в принципе возможно, что какой-то элемент окажется ребенком или парентом другого элемента в этом списке, но это их отношения, пришедшие ИЗВНЕ списка. В самом списке все элементы "равноуровневые".

ZackMercury 19.11.2016 00:56

Тоесть XMLList ведёт себя лишь как список, и ничего кроме, а XML является текстом с набором методов для удобной его обработки. XMLList может быть в виде XML в любом случае, а вот XML не всегда может быть XMLList, верно?

Или нет. XML это просто иерархическая DOM-модель документа, а не просто текст. Но технически XMLList может быть XML, но не наоборот?

Wolsh 19.11.2016 01:05

Цитата:

Сообщение от ZackMercury (Сообщение 1197438)
При выводе всего XML, оно выводит весь код XML, включая корневой тег, значит, следуя логике, при обращении к ребёнку, оно должно вывести не его содержимое, а конкретно тег+содержимое.

Во-первых, неправда. Пустой не выводит)
Код AS3:

                        var xmlPro:XML = 
                        <processes></processes>;
                        trace("XML:", xmlPro); // Выводит: "XML:"

Во-вторых, надо различать, когда Вы обращаетесь к ноде, а когда — к ее содержимому, или значению.
Если нода имеет сложное содержимое (вложенные ноды), то Вы обращаетесь непосредственно к объекту XML:
Код AS3:

                        var xmlPro:XML = 
                        <processes><circle/></processes>;
                        trace("XML:", xmlPro); // Выводит: "XML: <processes><circle/></processes>"

Если нода имеет простое содержимое, то Вы обращаетесь к содержимому:
Код AS3:

                        var xmlPro:XML = 
                        <processes>2</processes>;
                        trace("XML:", xmlPro); // Выводит: "XML: 2"

Советую также при трейсе XML использовать метод .toXMLString()

Добавлено через 7 минут
Цитата:

Но технически XMLList может быть XML, но не наоборот?
Когда XMLList содержит только одну ноду XML, с ним можно работать как с XML. Честно говоря, от этого больше неразберихи, чем пользы((
Коротко говоря, XML подразумевает иерархию и вложенность, а XMLList — линейность, один уровень иерархии. В каком-то смысле это просто одномерный Vector.<XML>.

Добавлено через 11 минут
Также не стоит забывать, что XMLList содержит ССЫЛКИ на ноды исходного XML, а не копии этих нод.

ZackMercury 19.11.2016 10:35

Цитата:

Сообщение от Wolsh (Сообщение 1197444)
Во-первых, неправда. Пустой не выводит)
Код AS3:

                        var xmlPro:XML = 
                        <processes></processes>;
                        trace("XML:", xmlPro); // Выводит: "XML:"

Во-вторых, надо различать, когда Вы обращаетесь к ноде, а когда — к ее содержимому, или значению.
Если нода имеет сложное содержимое (вложенные ноды), то Вы обращаетесь непосредственно к объекту XML:
Код AS3:

                        var xmlPro:XML = 
                        <processes><circle/></processes>;
                        trace("XML:", xmlPro); // Выводит: "XML: <processes><circle/></processes>"

Если нода имеет простое содержимое, то Вы обращаетесь к содержимому:
Код AS3:

                        var xmlPro:XML = 
                        <processes>2</processes>;
                        trace("XML:", xmlPro); // Выводит: "XML: 2"

Советую также при трейсе XML использовать метод .toXMLString()

Добавлено через 7 минут
Когда XMLList содержит только одну ноду XML, с ним можно работать как с XML. Честно говоря, от этого больше неразберихи, чем пользы((
Коротко говоря, XML подразумевает иерархию и вложенность, а XMLList — линейность, один уровень иерархии. В каком-то смысле это просто одномерный Vector.<XML>.

Добавлено через 11 минут
Также не стоит забывать, что XMLList содержит ССЫЛКИ на ноды исходного XML, а не копии этих нод.

Согласитесь, это немного нелогично с точки зрения программиста, который любит однородность в коде. Странно, что у XML toString не равно toXMLString. Было бы удобнее доставать значение тега, допустим, через innerXML или getValue().
Спасибо большое.

Wolsh 19.11.2016 13:18

Цитата:

Согласитесь, это немного нелогично с точки зрения программиста, который любит однородность в коде.
А вот и не соглашусь. Здесь фишка в том, что
1) дочерняя нода является свойством отцовской
2) тип ее значения не предопределен
Это ровно то же самое, как использование Object для хранения набора каких-то свойств. И вот допустим Вы делаете trace(_obj.foo); И если foo это инт, равный 2, то трейс и выдаст 2. А если foo это мувиклип, то... Так понятно?
Соответственно у XML есть методы для определения типа содержимого —
hasComplexContent()
hasSimpleContent()

В качестве подсказки, может пригодится для вашей задачи — чтобы узнать имя ноды, то есть "circle", "line", "shape" в вашем примере, можно использовать такую комбинацию:
_node.name().localName

ZackMercury 19.11.2016 15:43

Спасибо, вы крутой чел :)


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

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