我有以下xml:
<objects>
<property name="steps">
<property name="array">
<object type="com.tn.assistant.models.Step">
<property name="preDialogues">
<property name="array">
<object type="com.tn.assistant.models.Dialogue"/>
</property>
</property>
<property name="question">
<object type="com.tn.assistant.models.Question">
</object>
</property>
</object>
</property>
</property>
</objects>
我在Flex 4 / air应用程序中使用树来显示它。我需要过滤掉“步骤”,任何“数组”节点和“preDialogues”。他们不应该出现在树上,但他们的孩子应该。我扩展了DefaultDataDescriptor,并覆盖了getChildren(),以成功过滤步骤和数组标记。
override public function getChildren(node:Object, model:Object=null):ICollectionView
{
var ch:XMLList = new XMLList (node.xns::*);
var retXMLList:XMLList = new XMLList();
var retXMLListCtr = 0;
for (var i = 0; i < ch.length(); i++){
if (ch[i].@name == "array"){
return getChildren(ch[i]);
}
else if (ch[i].@name == "steps"){
return getChildren(ch[i]);
}
/*
else if (ch[i].@name == "preDialogues"){
return getChildren(ch[i]);
}
*/
else {
retXMLList[retXMLListCtr] = ch[i];
retXMLListCtr++;
}
}
var chil:XMLListCollection = new XMLListCollection (retXMLList);
var chil2:ICollectionView = ICollectionView(chil);
return chil2;
}
此代码成功过滤掉“steps”和“array”。但是,如果我取消注释“preDialogues”代码以尝试过滤掉preDialogues,则完全跳过问题节点。我可以看出为什么会发生这种情况,但我该怎么办呢?自从我完成递归以来已经有一段时间了。我以为我可以返回某种组合列表,或者某种东西,但我无法获得任何工作。感谢。
答案 0 :(得分:1)
它被跳过了,因为你处于“com.tn.assistant.models.Step”节点的级别。当你迭代那个节点的子节点时,在这种情况下,“preDialogues”和“question”,你来到的第一个只是返回它的子节点(在这种情况下,preDialogues的子节点)。它甚至从未达到检查“问题”的程度。
好像你想要更像的东西:
override public function getChildren(node:Object, model:Object=null):ICollectionView
{
var ch:XMLList = new XMLList (node.xns::*);
var retXMLList:XMLList = new XMLList();
var retXMLListCtr = 0;
for (var i = 0; i < ch.length(); i++){
var name:String = String(ch[i].@name);
if (name == "array" ||
name == "steps" ||
name == "preDialogues" ||
name == "question") {
retXMLList[retXMLListCtr] = getChildren(ch[i]);
} else {
retXMLList[retXMLListCtr] = ch[i];
}
retXMLListCtr++;
}
var chil:XMLListCollection = new XMLListCollection (retXMLList);
var chil2:ICollectionView = ICollectionView(chil);
return chil2;
}
它仍然遍历每个子节点,但当它到达“数组”节点时,它将其子节点添加到retXMLList并继续迭代,而不是简单地返回。