代码之家  ›  专栏  ›  技术社区  ›  invertedSpear

如何过滤掉XML的机密节点?

  •  0
  • invertedSpear  · 技术社区  · 15 年前

    以这个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>
    

    我需要某种类型的过滤器来获取此文件的副本,其中所有标记为“hidden”的节点都会像这样被删除:

    <root>
      <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>
    

    我试过用这种东西

    var newXML:XML = XML(root.(grandParent.@hidden != "true").(grandParent.parent.@hidden != "true").(grandParent.parent.child.@hidden !=true);
    

    但这实际上只是返回了原始XML(因为我在请求满足这些条件的根目录,所以得到了根目录)。我明白为什么我的方法不起作用,但我不知道从这里到哪里去。

    2 回复  |  直到 15 年前
        1
  •  1
  •   sberry    15 年前

    您可以使用这样的递归函数,假设您的XML在变量myxml中。这样做,您就不会被绑定到元素的名称(即祖父母、父母、子女),也不会受到级别数的限制(即,您可以添加 <pet> 节点到每个 <child> 节点)

    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>
    
        2
  •  0
  •   invertedSpear    15 年前

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

    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];
    }