Pergunta

Tenho XML com a seguinte estrutura, por exemplo

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

Todos os filhos têm o nome "nó".O que preciso é obter um XMLList (ou XML, não importa), com a mesma hierarquia, mas contendo apenas nós com a flag "true".

O resultado que preciso para o meu exemplo é:

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

Existe alguma maneira legal de fazer isso usando e4x (sem iterar no loop)?Eu tentei fazer o seguinte:xml.node.(@flag=="true"), mas o resultado neste caso é:

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

Alguma ideia?Obrigado!

Foi útil?

Solução

Aqui um forro em e4x como você pergunta:

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

ele exclui o nó para o atual XML então preste atenção para ter uma cópia do seu XML atual.

A propósito, você deveria saber disso e4x basta fazer um loop sob o capô e esse forro não será mais rápido do que um loop personalizado.

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())

Outras dicas

Não matou esses nós, porque sua condição xml.node.(@flag="true") funciona apenas nos filhos diretos do root, você tem que fazer outra para os filhos do nó

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top