Question

J'ai XML avec la structure suivante, par exemple

<root>
    <node flag="false"/>
    <node flag="true"/>
    <node flag="false"/>
    <node flag="false"/>
    <node flag="true">
        <node flag="false"/>
        <node flag="true"/>
        <node flag="false"/>
        <node flag="true"/>
    </node>
    <node flag="true"/>
    <node flag="false">
        <node flag="false"/>
        <node flag="true"/>
        <node flag="false"/>
        <node flag="true"/>
    </node>
    <node flag="false"/>
</root>

Tous les enfants ont nommé "noeud".Ce dont j'ai besoin, c'est d'obtenir un xmllist (ou XML, peu importe), avec la même hiérarchie, mais contenant uniquement des nœuds avec le drapeau "vrai".

Le résultat dont j'ai besoin pour mon exemple est:

<root>
    <node flag="true"/>
    <node flag="true">
        <node flag="true"/>
        <node flag="true"/>
    </node>
    <node flag="true"/>
</root>

Y a-t-il une bonne façon de le faire en utilisant E4X (sans itération à travers la boucle)?J'ai essayé de faire ce qui suit: xml.node. (@ drapeau=="vrai"), mais le résultat dans ce cas est:

<root>
        <node flag="true"/>
        <node flag="true">
            <node flag="false"/> <!--need to kill this node-->
            <node flag="true"/>
            <node flag="false"/> <!--need to kill this node-->
            <node flag="true"/>
        </node>
        <node flag="true"/>
    </root>

Des idées?Merci!

Était-ce utile?

La solution

Here a one liner in e4x as you ask :

xml..node.((@flag=="false") && (delete parent().children()[valueOf().childIndex()]))

it delete the node to the current XML so pay attention to have a copy of your current XML.

By the way you should know that e4x just do a loop under the hood, and that one liner will not be faster than a custom loop.

var xml:XML=<root>
    <node id="1" flag="false"/>
    <node id="2" flag="true"/>
    <node id="3" flag="false"/>
    <node id="4" flag="false"/>
    <node id="5" flag="true">
        <node id="5.1" flag="false"/>
        <node id="5.2" flag="true"/>
        <node id="5.3" flag="false"/>
        <node id="5.4" flag="true"/>
    </node>
    <node id="6" flag="true"/>
    <node id="7" flag="false">
        <node id="7.1" flag="false"/>
        <node id="7.2" flag="true"/>
        <node id="7.3" flag="false"/>
        <node id="7.4" flag="true"/>
    </node>
    <node id="8" flag="false"/>
</root>

trace("-- before --")
trace(xml.toXMLString())

xml..node.((@flag=="false") && (delete parent().children()[valueOf().childIndex()])) 

trace("\n-- after --")
trace(xml.toXMLString())

Autres conseils

It didn't kill those nodes, cause your condition xml.node.(@flag="true") works only on the direct children of root, you have to make another one for the children of node

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top