4

所以我有这个 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" && "2"

所以不确定这里应该是什么正确的查询,即使后代是正确的技术。

我也不想做冗长的额外 id="1" && id="2" 查询,因为我有这些值的无限组合("2" && "3"、"1" && "2" && " 3") 等。

任何想法都会最有帮助..

谢谢


所以帕特里克用这个表达式解决了这个问题:

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);

还有更多想法帕特里克..有人吗?

谢谢

4

2 回答 2

1

对于 Or 搜索,您可以简单地执行以下操作:

xml.Item.(descendants('ProductRange').(@id=="1" || @id=="2").length()>0);

使用自定义过滤器功能,您可以进行比 Or 更复杂的 And 搜索:

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"] ) ) );
于 2012-05-28T17:39:15.253 回答
0

这可能很混乱,但请耐心等待:

Items.Item.(
    ( descendants("ProductRange").@id == "1" || descendants("ProductRange").@id == "2" ) ||
    ( descendants("ProductRange").@id == "1" && descendants("ProductRange").@id == "2" )
)
于 2012-05-28T16:32:52.337 回答