2011-02-18 1 views
0

다음과 같은 구조의 XML이 있습니다. 예를 들어,Flex에서 XMLList에 대한 도움이 필요합니다.

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

어떤 아이디어? 고맙습니다!

답변

1

여기 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()) 
+0

완벽 해요! 고마워요!하지만 식의 두 번째 부분에 대해 다소 혼란 스럽습니다. 제발 설명해 주시겠습니까? parent(). children() [valueOf(). childIndex()] –

+1

@Timofei Davydik 부모 - 현재 노드의 부모를 얻는다 , children() <- 모든 자식의 배열을 얻는다 , valueOf() <- 현재 노드를 얻는다 , childIndex() <- 어린이 배열. – Patrick

+0

+1 좋은 대답,하지만 약간 혼란 스럽다. 약간 더 길지 만 쉽게 따라 할 수있는 방법. xml..node에 의해 생성 된 xmlList를 통해 for 루프를 실행하고 조건이있는 항목을 삭제합니다. http://stackoverflow.com/questions/4946007/xml-nodes-will-not-delete-despite-calling-delete/4948647#4948647 – Ryan

0

그것은 당신의 조건 xml.node의 원인, 그 노드를 죽이지 않았어요. (@ 플래그 = "진정한")는 루트의 직계 자식에서만 작동합니다, 당신은 노드의 아이들을위한 또 하나 확인해야

+0

나는 이런 일이 일어나는 이유를 알고 있습니다. 그리고 나는 좋은 솔루션을 찾고 있습니다. 나는 단지 노드를 반복하면서 아이들을 얻고 자르고 자르고 싶지 않다 ... –

+0

이 xml.node를 시도 했는가? (@ flag == "true) .node. (@ flag =="true ")? – Mansuro

+0

예, 시도했는데 한 수준의 XML을 반환했습니다.