XML に縛られていない場合 (たとえば、ファイル サーバーではなくアプリ サーバーを使用している場合)、AMF (アクション メッセージ フォーマット) を使用してデータを転送することを検討できます。アドビ独自のBlaze DSやOpenAMF、AMFPHP、PyAMFなどのコミュニティ オープン ソース バリアントを含むサーバーに AMF を公開するプロジェクトがいくつかあります。これにより、カスタム オブジェクトをサーバーから Flex に転送し、データ型の自動解析と型安全性を実現できます。このデータ転送オプションの比較を見て、相対的なメリットを理解してください。
そうは言っても、XML はアプリの構成データなどに非常に役立ち、アプリ サーバーを実行していない場合に役立ちます。私はすぐに手動でxmlを適切な構造に解析する他のポスターに同意します。私は通常、これらをポストフィックス VO (値オブジェクト用) と共に保存し、メンバーをパブリックのままにします。私はしばしばこれを階層的に行います。
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 秒かかり、属性または子タグからデータを読み取るのに 1 行かかります。このような複雑なスキームを避けることをお勧めしますが、完全を期すために簡単な例を示します。
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));
}
}
}
}
}