解析Flex Tree组件的XML

时间:2012-10-23 16:42:57

标签: actionscript-3 flex

在我继承的项目上,我需要从使用spark List组件切换到使用mx Tree组件,以便能够将项目分组到目录中。我对Flex / XML非常生疏,所以我想知道我是否可以在正确的方向上轻推如何处理它。

我的问题(详情/数据详情如下):

  • 如何从“学生”节点检测“studentGroup”节点?

  • 树组件需要一个字段用于显示名称。我 必须在'studentGroup'节点和'student'之间有一个共同的名称 节点

  • 我完全做错了吗?

以前我的XML数据是平的(为了清晰起见,我已经删除了所有细节):

<studentList>
  <student>
      <studentName>Sam</studentName>
  </student>
   <student>
       <studentName>Ruby</studentName>
   </student>
</studentList>

新格式是群体和个别学生的混合:

<studentList>
    <studentGroup>
       <studentGroupName>Chess</studentGroupName>
          <student>
              <studentName>Betty</studentName>
          </student>
        </studentGroup>
    <student>
        <studentName>Sam</studentName>
    </student>
    <student>
        <studentName>Ruby</studentName>
    </student>
</studentList>

目前正在使用此(再次简化的)代码解析XML:

for each (var prop:XML in studentsXML.file){
    tempArray = new ArrayCollection();
    for each(var studentProp:XML in prop.studentList.student){
       tempStudent = new Student(studentProp.studentName);
       tempArray.addItem(tempStudent);
    }
}

我需要改变它,以便'studentGroups'我做一件事而对'学生'我像上面那样处理它。在伪代码中,它看起来像下面但我在语法上绊倒(或者我可能完全偏离轨道?)。

for each (var prop:XML in studentsXML.file){
    tempArray = new ArrayCollection();
    for each(var studentProp:XML in prop.studentList){

       //HOW DO I DETECT A StudentGroup FROM A Student NODE?

       if (studentList.studentGroup){
          //student group
           tempStudentGroup = new StudentGroup(studentProp.studentGroupName);
             for each(var student:XML in studentList.studentGroup){
               tempStudent = new Student(studentProp.studentName);
               tempStudentGroup.add(tempStudent);
             }

            tempArray.addItem(tempStudentGroup);
       }else{
          //single student
          tempStudent = new Student(studentProp.studentName);
          tempArray.addItem(tempStudent);
       }
    }
}

2 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

for each(var studentGroup:XML in prop.studentGroup)
{
    //student group
    for each(var student:XML in studentGroup.student) {
        tempStudent = new Student(studentProp.studentName);
        tempStudentGroup.add(tempStudent);
    }
    tempArray.addItem(tempStudentGroup);
}
for each(var student:XML in prop.student)
{
    //single student
    tempStudent = new Student(studentProp.studentName);
    tempArray.addItem(tempStudent);
}

答案 1 :(得分:0)

如果想在mx:Tree中使用,你的xml会喜欢这样:

<studentList>
  <student label="Chess">
    <student label="Bett"/>
  </student>
  <student label="Sam"/>
  <student label="Ruby"/>
</studentList>

这意味着:您应该始终使用唯一字符串来包含任何深度的内容,以及mx:Tree 将这些显示为节点父节点或节点,取决于哪个有子节点。

第一个问题:你可以检查“hasChildren”来区分你的itemRenderer中的学生组和学生。像这样:

 override public function set data(value:Object):void {
   if( value != null ) { 
     super.data = value;

     if( TreeListData(super.listData).hasChildren ) {
       ...

你的第二个问题:是的,他们都使用“label”作为显示名称。