2012-02-07 68 views
0

我想根據多個參數篩選XML,並將其作爲輸入。基於多個參數過濾XML - Flex

我想識別具有匹配記錄的父節點,以便我可以將它們過濾出來並進行處理。

<A> 
    <B1> 
     <C1> 
      <D1>111</D1> 
      <E1>111</E1> 
      <F1> 
       <G1>111</G1> 
       <H1> 
        <I1>111</I1> 
        <J1>111</J1> 
       </H1> 
      </F1> 
     </C1> 
    </B1> 
    <B1> 
     <C1> 
      <D1>222</D1> 
      <E1>333</E1> 
      <F1> 
       <G1>222</G1> 
       <H1> 
        <I1>222</I1> 
        <J1>222</J1> 
       </H1> 
      </F1> 
     </C1> 
    </B1> 
    <B1> 
     <C1> 
      <D1>333</D1> 
      <E1>333</E1> 
      <F1> 
       <G1>333</G1> 
       <H1> 
        <I1>333</I1> 
        <J1>333</J1> 
       </H1> 
      </F1> 
     </C1> 
    </B1> 
</A> 

可以說,我需要匹配的節點D1和E1和I1,但如果所有的參數a「和」比賽,我需要從<B1>的結果節點權利。

<B1> 
    <C1> 
     <D1>222</D1> 
     <E1>333</E1> 
     <F1> 
      <G1>222</G1> 
      <H1> 
       <I1>222</I1> 
       <J1>222</J1> 
      </H1> 
     </F1> 
    </C1> 
</B1> 

我想USNG以下組合,以獲得數據:

xml..*.((hasOwnProperty("D1") && D1 == "222")&&hasOwnProperty("E1") && D1 == "333")) 

但認爲有一定的差距。有人可以填寫並告訴我我錯在哪裏,或者有更好的方法來過濾XML嗎? 另外,有沒有哪些filterFunction(集合)可以幫忙?

回答

1

您可以使用..運算符或調用其等價函數descendants()來獲取符合條件的所有子節點的XMLList,而不管它們在層次結構中的位置。然後,使用xml.(criteria),只選擇也與括號內的表達式匹配的節點:

var result:XMLList = xml..B1.(
    (descendants ("D1") == "222") && 
    (descendants ("E1") == "333") && 
    (descendants ("I1").length() > 0) // or any other expression 
    ); 
+0

哦,那很乾淨。 – Bob 2012-02-07 21:37:03

+0

解決了它,謝謝。 – Bob 2012-02-07 22:27:35

+0

我正在嘗試動態創建查詢部分,以便參數和密鑰接管構建標準部分。只是爲了顯示: 'var q1:String =「descendants(\」E1「)== \」111 \「)」;'//動態查詢構建,這只是爲了演示。 'Alert.show(「Query >>」+ q1.toString()); //輸出:後代(「E1」)==「111」 \t \t 'var r2:XMLList = xmlData .. *。(descendants(「E1」)==「111」); //給出正確的回答# 'var r1:XMLList = xmlData .. *。(q1.toString()); //給出奇怪的迴應,不會過濾掉任何東西。' **這裏是缺少的東西還是這個錯誤的方法** – Bob 2012-02-07 22:34:44