0

たとえば、次の構造の XML があります。

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

すべての子には「ノード」という名前があります。私が必要としているのは、同じ階層を持つ XMLList (または XML に関係なく) を取得することですが、フラグが「true」のノードのみが含まれています。

私の例に必要な結果は次のとおりです。

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

(ループを反復せずに) e4x を使用してこれを行う良い方法はありますか? xml.node.(@flag=="true") を実行しようとしましたが、この場合の結果は次のとおりです。

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

何か案は?ありがとうございました!

4

2 に答える 2

2

e4xここにあなたが尋ねるワンライナーがあります:

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

現在のノードを削除するXMLので、現在のXMLのコピーがあることに注意してください。

ちなみに、e4x内部でループを実行するだけで、1つのライナーがカスタムループよりも高速になることはないことを知っておく必要があります。

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())
于 2011-02-18T11:00:18.710 に答える
1

これらのノードを強制終了しませんでした。条件 xml.node.(@flag="true") がルートの直接の子でのみ機能するため、ノードの子用に別のノードを作成する必要があります

于 2011-02-18T09:42:20.853 に答える