Search

Rss Posts

Rss Comments

Login

 

Flex XML, XMLList и XMLListCollection

Сен 10

Flex содержит целых три класса для работы с XML-объектами: XML, XMLList, XMLListCollection. На первый взгляд необходимость такого разнообразия не очевидна.

Класс XML дает нам возможность работать с xml-данными по стандарту E4X, что есть чрезвычайно удобно. Ведь мы можем проходить по элементам xml-объекта как по массиву: company2.employee[1].name, или обращаться к элементу с заданными параметрами (поиск): company2.employee.(name==’Employee6′).email. Смотрите в примере.

При этом xml-объект должен быть правильно сформированным: содержать один общий для всех корневой элемент (root node). Например:

<employers>

<employee>

<name>Employee4</name>

<email>employee4@company2.com</email>

</employee>

<employee>

<name>Employee5</name>

<email>employee5@company2.com</email>

</employee>

</employers>

В данном случае, корневым элементом является «employers». Вы можете конвертировать строку, приведенную выше в XML объект, но если бы эта строка не содержала корневого элемента, получили бы ошибку. См. пример.

Для тех целей, когда вам необходимо просто иметь xml-структурированные данные, и нет нужды (или возможности) в «well formatted» xml документе, вам дана возможность использовать класс XMLList. Само название говорит за себя: список xml документов. Например, нижеприведенная строка есть валидный XMLList объект:

<employee>

<name>Employee4</name>

<email>employee4@company2.com</email>

</employee>

<employee>

<name>Employee5</name>

<email>employee5@company2.com</email>

</employee>

Т.е. говоря по-русски, просто нет корневого элемента. Таким образом, класс XMLList содержит произвольные XML данные, что на практике очень удобно.

А зачем же тогда root node вообще нужен? В нем вы можете задавать пространства имен, используемых в документе. Например, во Flex’e мы используем пространство xmlns:mx=”http://www.adobe.com/2006/mxml”, это гарантирует нам уникальность имен классов библиотеки Flex с другими библиотеками совместно используемых в одном документе.

Теперь о XMLListCollection. Вы знаете, что Flex предоставляет нам в пользование два замечательных класса т.н. «коллекций данных»: ArrayCollection, XMLListCollection. Это сложные, составные объекты данных, позволяющие нам манипулировать как одним целым. Помимо других очень важных и полезных свойств (например, итерации), эти классы добавляют возможность публикации события CollectionEvent.COLLECTION_CHANGE. Это делает объект XMLListCollection доступным для связывания (Binding). Так, в нашем примере, для связывания компоненты txt1 класса Text с ее свойством text объекта company1 класса XMLList мне пришлось использовать явное связывание:

<mx:Binding destination=”txt1.text” source=”company1″ />

Я не мог использовать связывание через фигурные скобки (curly braces), поскольку класс XMLList не наследует класс EventDispatcher. Если бы я имел в своем приложении объект класса XMLListCollection:

<mx:XMLListCollection id=”xmlLC” />

То я бы смог привязаться к ней через фигурные скобки:

<mx:Text id=”txt1″ text=”{xmlLC}”/>

Источником данных для XMLListCollection является XMLList, но не XML.

Итак, резюмируя можно сказать, что если вам нужен xml-объект и при этом он не является каким-то регламентированным форматом данных (например, SOAP), используйте XMLList.

Пару слов о методе toString() и toXMLString(). Если xml объект является комплексным, т.е. содержит хотя бы один дочерний элемент, то метод toString() вернет тоже что и toXMLString(). Пример:

1).

private var xml:XML = <root name=’hi’></root>;

trace (xml.toString()); // покажет ”

trace (xml.toXMLString()); // покажет ‘<root name=”hi”/>’

2).

private var xml:XML = <root name=’hi’><hello /></root>;

trace (xml.toString()); // покажет ‘<root name=”hi”><nello/></root>’

trace (xml.toXMLString()); // покажет ‘<root name=”hi”><nello/></root>’

 

Для объекта класса XMLList метод toString() запускается для каждого дочернего XML объекта.

Смотрите также пример для данной статьи. Доступен просмотр кода.