2008-09-02 7 views
2
내가 수동으로 HTTPService 호출을 통해 수신되는 XML 데이터를 통해 반복하는 데 문제가

은 XML과 같은 :어떻게 Flex에서 결과 개체를 반복합니까?

 

<DataTable> 
    <Row> 
     <text>foo</text> 
    </Row> 
    <Row> 
     <text>bar</text> 
    </Row> 
</DataTable> 
 

webservie 결과 이벤트는이 같은 일을 발사 할 때 :

 

for(var i:int=0;i<event.result.DataTable.Row.length;i++) 
{ 
    if(event.result.DataTable.Row[i].text == "foo") 
     mx.controls.Alert.show('foo found!'); 

} 
 

이 코드는 다음 "Row"노드가 하나 이상 반환되는 경우 작동하지만 "Row"노드가 하나만있는 경우 event.DataTable.Row 개체는 오류가 아니며 이후에 코드가 손상되는 것으로 보입니다.

HTTPService 결과 개체를 순환시키는 적절한 방법은 무엇입니까? XMLList 컬렉션 또는 ArrayCollection 형식으로 변환해야합니까? 여러 행 요소가없는 한

답변

4

문제는

event.result.DataTable.Row.length 

lengthXMLList의 속성없는이 성명에서 거짓말을하지만, 방법은 :

event.result.DataTable.Row.length() 

그것은 혼란,하지만 그것이 방법이다.

추가 :

for each (var node : XML in event.result.DataTable.Row) 
:
실제로 할 수있는 가장 안전한 방법은 실수를 결코 그런 식으로는, XMLList 이상의 반복되는 경우 항상 for each 루프를 사용하는 것입니다, 그것을 읽을 적은 코드를, 그리고 쉽게
2

행은 배열이 아닌 ...

덕분에 나는 "E4X"로 resultFormat 설정을 시도하고 아직 문제를 해결해야한다. 그것은 성가신 일이다. 이런 식으로해야하지만, 잠시 후에 AS3을 작성하지 않았기 때문에 존재하는 함수가 있는지 잊어 버릴 수 있습니다.

if (exists(event.result.DataTable) && exists(event.result.DataTable.Row)){ 
    if (exists(event.result.DataTable.Row.length)) { 
    for(var i:int=0;i<event.result.DataTable.Row.length;i++) 
    { 
     if (exists(event.result.DataTable.Row[i].text) 
     && "foo" == event.result.DataTable.Row[i].text) 
      mx.controls.Alert.show('foo found!'); 
    } 
    } 
    if (exists(event.result.DataTable.Row.text) 
    && "foo" == event.result.DataTable.Row.text) 
     mx.controls.Alert.show('foo found!'); 
} 
1

나는 XML 개체에 저장 한 다음 해당 메서드를 사용하여 필요한 노드 값을 검색합니다.

var returnedXml:Xml = new Xml(event.result.toString());