0

私はフレックスが初めてです。複雑なオブジェクトを XML に変換しようとしています。

オブジェクトをトラバースしようとすると問題が発生します。ここにコード スニペットを追加します。

従業員オブジェクトの作成

        var result:String = new String();
        employeeDept = new EmployeeDept();  
        employee = new Employee();
        employee.employeeId = "56789";
        employee.employeeName = "XYZ";
        //tempString = tempString + "--- Step n ---";

        /*employee.employeeDept.deptId = "2";
        employee.employeeDept.deptName = "APPLE";*/

        employeeDept=new EmployeeDept();            
        employeeDept.deptId = "3";
        employeeDept.deptName = "MS";
        employee.employeeDept.addItem(employeeDept);


        employeeDept=new EmployeeDept();            
        employeeDept.deptId = "2";
        employeeDept.deptName = "APPLE";
        employee.employeeDept.addItem(employeeDept);

        empCollection.addItem(employee);

従業員オブジェクトでコンバーター メソッドを呼び出す

             recursive(employee, "ShopServiceLifeCycleArtifacts");

コンバーター方式

                  public function recursive(obj:Object, str:String):String
             {
           try
            {
        var xml:XML=new XML('<' + str + '></' + str + '>' );
        if(obj is Array && obj.length!=0)
        {   //tempString = tempString + "--- Recursive IF Loop---" + obj.length;
            var ac:ArrayCollection=new ArrayCollection(obj as Array);
            var xml2:XML=new XML(<dept></dept>);
            for (var i:Number=0; i<ac.length; i++)
            {   
                var myObj:Object=ac.getItemAt(i);
                for (var prop:String in myObj)
                {
                    xml2.appendChild(new XML("<" + prop + ">" + myObj[prop]  + "</" + prop + ">"));
                }
            }
            xml.appendChild(xml2);  
        } else {
            if (obj==null)
                tempString = tempString + "--- Obj is null ---";
            else
            {
                tempString = tempString + "--- Obj is not null ---";
            }


            for (var property:String in obj)
            {   
                tempString = tempString + property;
                if(obj[property] is Array)
                {   
                    tempString = tempString + "--- obj[property] is Array---";
                    xml.appendChild(recursive(obj[property] as Array, property));
                } else {
                    tempString = tempString + "--- obj[property] is not Array---";
                    xml.appendChild(XML("<" + property + ">" + obj[property].toString() + "</" + property + ">"));
                }
            }
        }
    }catch(e:Error)
    {
        return tempString+"----------"+e.message; 
    }
    tempString = tempString +xml.toString();
    return xml.toString();
}

}

しかし、問題は、私の従業員オブジェクトが配列ではないため、else ブロックに移動することです。オブジェクトが null かどうかを確認しています。オブジェクトが null ではありません。

次のステップ、つまり for ループに進みます

              for (var property:String in obj){

ここで問題が発生します。このforループに入らず、nullを返します。:(

アクションスクリプトファイルで従業員オブジェクトを作成し、ここでその従業員のインスタンスを取得する代わりに、ここで従業員名オブジェクトを宣言して定義すると、ロジックが機能します。そのコードも示します。

                      else {
            //tempString = tempString + "--- Recursive Else Loop---";
            var employeeNew:Object = {employeeId:"123", employeeName:"San Francisco", 
                empDept :[{empDeptId:"12345", empDeptName:"XYZ"},{empDeptId:"54568", empDeptName:"ABC"}]}; 


            for (var prop:String in employeeNew) {      
                //trace("myObject."+prop+" = "+employeeNew[prop]);

                if(employeeNew[prop] is Array)
                {   

                    xml.appendChild(recursive(employeeNew[prop] as Array, prop));
                } else {
                    tempString = tempString + "--- obj[property] is not Array---";
                    xml.appendChild(XML("<" + prop + ">" + employeeNew[prop].toString() + "</" + prop + ">"));

                }

            }  

このオブジェクトを使用すると、XML に変換できます。Plz は、私がここでやっている間違いが何であるかを教えてください。なぜなら、私はオブジェクトをトラバースできないからです。

前もって感謝します。

4

1 に答える 1

0

for ... inループは、オブジェクトの動的プロパティでのみ機能します。動的プロパティは、実行時にオブジェクト/クラスに追加できるプロパティです。

2 番目のアプローチは、Objectプロパティを追加した実際の値を反復処理しているため機能します。

Employeeオブジェクトを繰り返し処理しているため、最初の例は機能しません。従業員クラスは としてマークされていdynamicないため、追加のプロパティを追加することはできません。作成したとしてもdynamic(パフォーマンスに影響します)、クラスで定義したプロパティではなく、実行時に追加した追加のプロパティに対してのみ反復されます。

このタイプの問題に対する 1 つの解決策は、次を使用することdescribeType()です。

于 2012-08-01T13:25:09.470 に答える