所以我有这个XML结构:
<Items>
<Item name="aaa">
<ProductRanges>
<ProductRange id="1" />
</ProductRanges>
</Item>
<Item name="bbb">
<ProductRanges>
<ProductRange id="2" />
</ProductRanges>
</Item>
<Item name="ccc">
<ProductRanges>
<ProductRange id="1" />
<ProductRange id="2" />
</ProductRanges>
</Item>
</Items>
使用以下E4X查询,我只获得项目“aaa”和项目“bbb”。
trace( Items.Item.(descendants("ProductRange").@id == "1" || descendants("ProductRange").@id == "2") );
然而,我可以理解为什么我没有看到项目“ccc”因为它是两个id =“1”&amp;&amp; “2”
所以不确定这里的正确查询应该是什么,即使后代是正确的技术。
我不想结束长时间的额外id =“1”&amp;&amp; id =“2”查询要么是因为我有这些值的无限组合(“2”&amp;&amp;“3”,“1”&amp;&amp;“2”&amp;&amp;&quot;“3”)等。
任何想法都会有所帮助..
由于
所以Patrick用这个表达式解决了这个问题:
xml.Item.(descendants('ProductRange').(@id=="1" || @id=="2").length()>0);
然而,更进一步,如何动态创建@id值,因为这将是一个不断变化的查询,具体取决于用户选择。
像这样的东西(但是这个,但这不起作用):
var attributeValues:String = "@id==\"1\" || @id==\"2\" || @id==\"3\" || @id==\"4\"";
xml.Item.(descendants('ProductRange').(attributeValues).length()>0);
更多的想法帕特里克......有人吗?
由于
答案 0 :(得分:1)
对于或搜索,您只需执行以下操作:
xml.Item.(descendants('ProductRange').(@id=="1" || @id=="2").length()>0);
使用自定义过滤器功能,您可以进行比搜索更复杂的搜索:
var xml:XML=<Items>
<Item name="aaa">
<ProductRanges>
<ProductRange id="1" />
</ProductRanges>
</Item>
<Item name="bbb">
<ProductRanges>
<ProductRange id="2" />
</ProductRanges>
</Item>
<Item name="ccc">
<ProductRanges>
<ProductRange id="1" />
<ProductRange id="3" />
<ProductRange id="2" />
</ProductRanges>
</Item>
</Items>;
function andSearch(node:XMLList, searchFor:Array) {
var mask:int = 0;
var match:int = (1 << searchFor.length ) - 1;
var fn:Function = function(id:String) {
var i:int = searchFor.indexOf(id);
if (i >= 0) {
mask = mask | (1<<i);
}
return mask==match;
}
node.(ProductRange.(fn(@id)));
return mask==match;
}
trace( xml.Item.( andSearch( ProductRanges, ["1", "2"] ) ) );
答案 1 :(得分:0)
这可能很麻烦,但请耐心等待:
Items.Item.(
( descendants("ProductRange").@id == "1" || descendants("ProductRange").@id == "2" ) ||
( descendants("ProductRange").@id == "1" && descendants("ProductRange").@id == "2" )
)