如何过滤XML的安全节点?

如何过滤XML的安全节点?,xml,apache-flex,actionscript-3,actionscript,e4x,Xml,Apache Flex,Actionscript 3,Actionscript,E4x,以XML为例: <root> <grandParent GPid="1" hidden="false"> <parent Pid="1" hidden="false"> <child Cid="1" hidden="false"/> <child Cid="2" hidden="true"/> </parent> <parent Pid="2" hidden="fal

以XML为例:

<root>
  <grandParent GPid="1" hidden="false">
    <parent Pid="1" hidden="false">
      <child Cid="1" hidden="false"/>
      <child Cid="2" hidden="true"/>
    </parent>
    <parent Pid="2" hidden="false">
      <child Cid="3" hidden="false"/>
      <child Cid="4" hidden="false"/>
    </parent>
  </grandParent>
  <grandParent GPid="2" hidden="false">
    <parent Pid="3" hidden="false">
      <child Cid="5" hidden="true"/>
    </parent>
    <parent Pid="4" hidden="true">
      <child Cid="6" hidden="false"/>
    </parent>
  </grandParent>
  <grandParent GPid="3" hidden="true">
    <parent Pid="5" hidden="false">
      <child Cid="7" hidden="false"/>
    </parent>
  </grandParent>
</root>

但这实际上只是返回了原始的XML(因为我要的是满足这些条件的根,所以我得到了根)。我理解为什么我的方法不起作用,但我不知道从这里走到哪里。

所以我能想到的是,但我不喜欢循环。如果您有更好的方法,请告诉我:

var newXML:XML = new XML(root);
var i:uint=0;
for(i=0;i<newXML.grandparent.parent.child.(@hidden == false).length();i++){
  delete newXML.grandparent.parent.child.(@hidden == false)[0];
  //always [0] since the list is shortened by 1 each iteration
}
for(i=0;i<newXML.grandparent.parent.(@hidden == false).length();i++){
  delete newXML.grandparent.parent.(@hidden == false)[0];
}
for(i=0;i<newXML.grandparent.(@hidden == false).length();i++){
  delete newXML.grandparent.(@hidden == false)[0];
}
var newXML:XML=newXML(根);
变量i:uint=0;

对于(i=0;i您可以使用这样的递归函数,假设您的XML是一个变量myXML。这样做,您就不会被绑定到元素的名称(即祖父母、父母、孩子)上,也不会受到级别数量的限制(即,您可以向每个
节点添加一个
节点)




我知道你在这里做什么了。你知道递归函数的效率比我回答中的删除循环高还是低吗?递归函数的效率大约是前者的30-50倍。使用此函数运行代码50次,因为初始XML平均需要110毫秒。我的平均需要3毫秒。你可以提高代码的速度,使其达到大约t平均20毫秒,只需将每个循环的顺序颠倒为3(因此先循环祖父母,然后循环父母,然后循环孩子)。如果您不明白这为什么会提高速度,请告诉我,我可以解释。当然,相对增加完全取决于祖父母和父节点的数量,hidden=“true”。如果它们都没有hidden=“true”,则通过对for each循环重新排序,您的代码不会运行得更快。我明白了为什么反向速度会快得多,消除了下一轮循环中要循环的子节点=更少。感谢您的解释。
var newXML:XML = XML(root.(grandParent.@hidden != "true").(grandParent.parent.@hidden != "true").(grandParent.parent.child.@hidden !=true);
var newXML:XML = new XML(root);
var i:uint=0;
for(i=0;i<newXML.grandparent.parent.child.(@hidden == false).length();i++){
  delete newXML.grandparent.parent.child.(@hidden == false)[0];
  //always [0] since the list is shortened by 1 each iteration
}
for(i=0;i<newXML.grandparent.parent.(@hidden == false).length();i++){
  delete newXML.grandparent.parent.(@hidden == false)[0];
}
for(i=0;i<newXML.grandparent.(@hidden == false).length();i++){
  delete newXML.grandparent.(@hidden == false)[0];
}
public function removeElements( avXml:XML, avAttributeName:String, avCondition:String) {

    var lvAttributeValue:String;
    var lvXml:XML;

    var lvXmlList:XMLList = new XMLList();
    for each( lvXml in avXml.children() ) {
        lvAttributeValue = lvXml.attribute( avAttributeName );
        if( lvAttributeValue == avCondition )
            lvXmlList += lvXml;

        avXml.setChildren( lvXmlList ); 
    }

    for each( var lvXmlChild:XML in avXml.children() ) {
        removeElements(lvXmlChild,avAttributeName,avCondition);
    } 
}


removeElements(myXML, "hidden", "false");
trace(myXML.toXMLString());
 <root hidden="false">
      <grandParent GPid="1" hidden="false">
        <parent Pid="1" hidden="false">
          <child Cid="1" hidden="false"/>
        </parent>
        <parent Pid="2" hidden="false">
          <child Cid="3" hidden="false"/>
          <child Cid="4" hidden="false"/>
        </parent>
      </grandParent>
      <grandParent GPid="2" hidden="false">
        <parent Pid="3" hidden="false"/>
      </grandParent>
    </root>