Если вы не привязаны к XML (например, у вас есть сервер приложений вместо файлового сервера), вы можете использовать AMF ( Action Message Format ) для передачи данных. Есть несколько проектов, которые предоставляют AMF для серверов, включая собственные Blaze DS от Adobe и варианты с открытым исходным кодом сообщества, такие как OpenAMF , AMFPHP , PyAMF и так далее. Это даст вам возможность переносить пользовательские объекты с сервера во Flex, автоматический анализ типов данных и безопасность типов. Взгляните на это сравнение вариантов передачи данных , чтобы получить представление об относительных достоинствах.
При этом XML может быть очень полезен для таких вещей, как данные конфигурации приложения, и в тех случаях, когда вы не используете сервер приложений. Я согласен с другим постером, где я сразу же разберу xml в соответствующие структуры вручную. Я обычно сохраняю их с VO после исправления (для Value Object) и оставляю участников как открытые. Я часто делаю это иерархически.
package model.vo
{
public class ConfigVO
{
public var foo:String;
public var bar:int;
public var baz:Boolean;
public var sections:Array;
public function ConfigVO(xml:XML)
{
parseXML(xml);
}
private function parseXML(xml:XML):void
{
foo = xml.foo;
bar = xml.bar;
baz = (xml.baz == "true");
sections = [];
for each(var sectionXML:XML in xml.section)
{
sections.push(new SectionVO(sectionXML));
}
}
}
}
package model.vo
{
public class SectionVO
{
public var title:String;
public function SectionVO(xml:XML)
{
parseXML(xml);
}
private function parseXML(xml:XML):void
{
title = xml.@title;
}
}
}
В прошлом я видел системы, которые будут связывать имена элементов XML с определениями классов. Они обычно используют своего рода интроспекцию в классе, чтобы определить, какие свойства считывать из XML, или у них будут некоторые статические свойства класса, которые сопоставляют свойства экземпляра с тегами или атрибутами XML. По моему опыту, они гораздо больше проблем, чем они того стоят. Для добавления нового открытого свойства и одной строки для считывания данных из атрибута или дочернего тега требуется всего 2 секунды. Я предлагаю избегать таких сложных схем, но я приведу простой пример для полноты.
package model
{
public class XMLReader
{
// maps <tagname> to a class
private static var elementClassMap:Object =
{
"section": SectionVO,
"person": PersonVO
};
public var parsedElements:Array;
public function XMLReader(xml:XML)
{
parsedElements = [];
parseXML(xml);
}
private function parseXML(xml:XML):void
{
var voClass:Class;
for each(var element:XML in xml.children())
{
voClass = elementClassMap[element.name().localname];
if(voClass)
{
parsedElements.push(new voClass(element));
}
}
}
}
}