Нужна помощь с XMLList в Flex - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть 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>

Есть идеи?Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Здесь один вкладыш в e4x, как вы спрашиваете:

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

, он удаляет узел с текущим XML, поэтому обратите внимание на копию текущего XML.

Кстати, вы должны знать, что e4x просто сделать петлю под капотом, и что один вкладыш не будет быстрее, чем пользовательский цикл.

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())
1 голос
/ 18 февраля 2011

Это не убило эти узлы, потому что ваше условие xml.node. (@ Flag = "true") работает только на прямых дочерних элементах root, вы должны сделать еще один для дочерних элементов узла

...