4

私が取り組んでいるプロジェクトでは、Web サーバーから XML を取得し、そこからデータ ストアを構築します。データには特定のコア フィールドがありますが、拡張可能である必要があります。たとえば、追加のフィールドを追加したい場合があります。

Flex アプリでは、中央のデータ ストアが XML オブジェクトを操作したり、単にプロパティをオブジェクトに入れたりしたくありません。XML から作成/入力される Person クラスなどの強力な型が必要です。

これを柔軟な方法で行うにはどうすればよいでしょうか。属性名が一致する場合、Flex は XML から Person を自動的に構築できますか? または、 、 などの変換機能を記述する必要がありますか?

4

6 に答える 6

3

これは自動的にできるとは思いません。私は通常、自分が持っているXML構造をミラーリングするクラスを作成してから、静的クラスメソッドを作成して、XMLノードが指定されたオブジェクトのインスタンスを作成します。例えば:

package {

  public class Foo{

     public function Foo(barparam1:String, barparam2:uint, barparam3:String, barparam4:Number){
       this._bar1 = barparam1;
       this._bar2 = barparam2;
       this._bar3 = barparam3;
       this._bar4 = barparam4;
       }

     protected var _bar1:String;
     protected var _bar2:uint;
     protected var _bar3:String;
     protected var _bar4:Number;

     public function get bar1():String{ return this._bar1; }
     public function get bar2():uint    { return this._bar2; }
     public function get bar3():String  { return this._bar3; }
     public function get bar4():Number  { return this._bar4; }

     public function toString():String{
        return "[Foo bar1:\"" + this.bar1 + "\", bar3:\"" + this.bar3 + "\", bar2:" + this.bar2 + ", bar4:" + this.bar4 + "]";
        }

     public static function createFromXml(xmlParam:XML):Foo{

        /* XML Format:
          <foo bar1="bar1value" bar2="5">
            <bar3>bar3 data</bar3>
            <bar4>10</bar4>
          </foo>
        */

       return new Foo(xmlParam.@bar1, xmlParam.@bar2, xmlParam.bar3[0], xmlParam.bar4[0]);
       }
    }
  }
于 2008-10-09T12:13:52.913 に答える
1

XML に縛られていない場合 (たとえば、ファイル サーバーではなくアプリ サーバーを使用している場合)、AMF (アクション メッセージ フォーマット) を使用してデータを転送することを検討できます。アドビ独自のBlaze DSやOpenAMFAMFPHPPyAMFなどのコミュニティ オープン ソース バリアントを含むサーバーに 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));
                }
            }
        }
    }
}
于 2008-10-11T19:49:36.337 に答える
0

flex simplexmldecoder クラス@flexExamplesを使用して xml をオブジェクトに変換する

于 2008-10-24T11:11:18.807 に答える
0

少し前に、Action Script オブジェクトを XML との間でシリアライズおよびデシリアライズするのに役立つ Flex ライブラリの作業を開始しました。モデル オブジェクトを作成し、フィールドに注釈を付けて、フィールドをシリアライズする方法 (要素、属性、名前など) をシリアライザーに知らせ、(デ) シリアライズ プロセスを呼び出すだけです。

あなたのニーズに合っていると思います。

必要に応じて、 http://code.google.com/p/flexxb/で確認できます。

これが役立つことを願っています。

于 2008-11-11T12:13:59.537 に答える
0

AsBeanGenはこれを行うことができます。DTD 駆動型 XML ファイルの値オブジェクトを生成します。

于 2009-09-02T22:39:15.233 に答える