将actionscript对象转换为XML时出现问题

时间:2012-08-01 12:15:41

标签: actionscript-3 flex

我是初学者。我正在尝试将复杂对象转换为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。

我要进入下一步,即循环

              for (var property:String in obj){

问题来了。它不会进入这个for循环&amp;返回null。 :(

而不是在动作脚本文件中创建员工对象&amp;如果我声明并且在这里确定该员工的实例在这里定义一个employeeName对象,然后才能运行逻辑。我也将展示该代码。

                      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让我知道我在这里做的错误是什么,因为我无法遍历这个对象。

先谢谢。

1 个答案:

答案 0 :(得分:0)

for ... in循环仅适用于对象的动态属性。动态属性是可以在运行时添加到对象/类的属性。

您的第二种方法有效,因为您正在迭代已添加属性的实际Object

第一个示例不起作用,因为您正在迭代Employee对象。员工类未标记为dynamic,因此您无法向其添加其他属性。即使您将其dynamic(具有性能影响),它也只会迭代您在运行时添加的其他属性,而不是您在类中定义的属性。

此类问题的一个解决方案是使用describeType()