我是初学者。我正在尝试将复杂对象转换为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让我知道我在这里做的错误是什么,因为我无法遍历这个对象。
先谢谢。
答案 0 :(得分:0)
for ... in
循环仅适用于对象的动态属性。动态属性是可以在运行时添加到对象/类的属性。
您的第二种方法有效,因为您正在迭代已添加属性的实际Object
。
第一个示例不起作用,因为您正在迭代Employee
对象。员工类未标记为dynamic
,因此您无法向其添加其他属性。即使您将其dynamic
(具有性能影响),它也只会迭代您在运行时添加的其他属性,而不是您在类中定义的属性。
此类问题的一个解决方案是使用describeType()
: