2012-05-28 104 views
4

所以我有這樣的XML結構:E4X選擇節點那裏繼承者可以是A或B或A &&乙

<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")[email protected] == "1" || descendants("ProductRange")[email protected] == "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); 

任何更多的想法帕特里克..任何人?

感謝

+0

您應該打開另一個問題,因爲這個問題已經得到解答,可以創建一個包含您的值的數組,然後搜索它:http://pastebin.com/vxyVK86V – Patrick

回答

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"]))); 
+0

這只是返回「ccc」...這似乎很有用,但我的理解是,這將只返回「AND」組合。我仍然需要分別查詢「OR」嗎? – ukmikeb

+0

@ukmikeb是的,這是爲了更復雜的搜索,或者,我已經添加上面的Or查詢。 – Patrick

+0

輝煌......感謝帕特里克! – ukmikeb

0

這可能是混亂的,但包涵:

Items.Item.(
    (descendants("ProductRange")[email protected] == "1" || descendants("ProductRange")[email protected] == "2") || 
    (descendants("ProductRange")[email protected] == "1" && descendants("ProductRange")[email protected] == "2") 
) 
+0

我不認爲這裏的布爾邏輯是對?你可以仔細檢查。我如何讀取這是if(ProductRange.id == 1或ProductRange.id == 2)作爲謂詞1,如果其中任何一個爲真,則爲true,那麼它將再次「存儲」,其中包含部分包含ProductRange .id == 1,如果該部分是真的,第一個謂詞已經是真的,因此「orring」它沒有影響? – shaunhusain

+0

感謝您的嘗試...但這仍然只是返回「aaa」和「bbb」。 要嘗試帕特里克的建議。 – ukmikeb

相關問題