2012-02-07 67 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