2009-09-29 47 views
1

说,我们有以下的XML:E4X可以传递数组吗?

<people> 
<person> 
    <name>Jake</name> 
    <skills> 
    <skill>JavaScript</skill> 
    <skill>HTML</skill> 
    <skill>Flex</skill> 
    <skill>CSS</skill> 
    </skills> 
</person> 
<person> 
    <name>John</name> 
    <skills> 
    <skill>C++</skill> 
    <skill>Foxpro</skill> 
    </skills> 
</person> 
<person> 
    <name>Josh</name> 
    <skills> 
    <skill>JavaScript</skill> 
    <skill>XML</skill> 
    <skill>Flex</skill> 
    </skills> 
</person> 
</people> 

我希望能够使用E4X做的是找到匹配的技能列表/阵列我通过它,所有的人对象。所以,说我想找到所有具有HTML或JavaScript技能的人。

我知道我可以做:

people.person.(descendants("skill").contains("HTML")) 

people.person.(descendants("skill").contains("JavaScript")) 

但我真的想(/需要)做一条线(Flex中的XMLListCollection过滤功能的它的一部分)。虽然我试图就这一主题变化和无处

像这样的事情将是理想的

people.person.(descendants("skill").contains("HTML","JavaScript")) 

。什么会是伟大的将是:

people.person.(descendants("skill").in("HTML", "JavaScript")) 

或类似的东西。

有人知道我在做什么是可能的吗?

我真的想避免在那里添加我自己的循环。

杰克

回答

2

没有与编译器验证这一点,但这个应该工作...

people.person.(descendants("skill").contains("HTML") || descendants("skill").contains("JavaScript")) 

这里的另一个起飞 -

如果你想核对内的数组E4X声明,我想你不走运。尽管有一种可能的解决方法,但它涉及到在E4X中使用自定义函数,并简单地将循环移到主代码块之外。有点多余,如果你真的想避免循环。

var skillsArray:Array = ["HTML", "JavaScript"]; 
var peopleWithSkills:XMLList = people.person.(matchSkills(descendants("skill"), skillsArray)); 

function matchSkills(xmlList:XMLList, skillsArray:Array):Boolean 
{ 
    for each (var personSkill:XML in xmlList) 
    { 
     if (skillsArray.indexOf(personSkill.toString()) > -1) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

我最好的建议是要真正看看你的心脏,并决定是否你需要避免环路,或者如果你只是想避开他们。 ;)

+0

再次尼科。你是E4X专家? 麻烦的是我想传递一个实际的数组对象而不是两个已知的值。 杰克 – 2009-09-30 10:04:23

+0

不是专家,但让我们说我喜欢解决这些问题。 ;) – 2009-10-04 12:23:24

+0

我想你是对的。我只是想避免循环,而不是避免它们。 再次感谢您的解决方案。如果我能够解决问题,我会和代码一起玩,并将其标记为答案。 – 2009-10-05 08:20:28

相关问题