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 объекта.
Смотрите также пример для данной статьи. Доступен просмотр кода.