假设我们有以下XML:
<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"))
或类似的东西。
有人知道我在做什么是可能的吗?
我真的想避免在那里添加我自己的循环。
杰克
答案 0 :(得分: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;
}
我最好的建议是真实地调查你的内心并决定你是否需要以避免循环,或者你只是想避免它们。 ;)