이번에 Flex로 위젯을 만들게 되었는데 서버로부터 xml 데이터를 가져와 이를 뿌려줘야 하는 기능이 필요했다. Javascript에서는 json으로 변환해주는 라이브러리가 많아 간편하게 쓸 수 있는 XML 파서 라이브러리가 있나 찾아봤는데 생각처럼 잘 검색되지 않았다. (뭐 어딘간 있겠지..;;) 뭐 있다 하더라도 받아오는 xml 데이터 형식이 그리 복잡하지도 않고 바뀌지도 않기 때문에 만들어보았다.
함수 구조는 뭐 크게 어렵지 않다. 다만 범용적으로 만들지 않고, 내가 쓰는 xml을 파싱하는데 맞췄기 때문에 다른데에 사용하려면 수정이 필요하겠지.
현재 들어오는 xml 데이터가 이런 구조이기 때문에 우선 children 중에 item이 아닌 것은 걸러주고 item일 경우에는 item의 property를 object의 key로 설정하여 값을 집어넣는다. 원래는 들어오는데로 차곡차곡 쌓아서 index로 접근하려고 했는데 나중에 소스를 봤을 때 뭐가 뭔지 모를 꺼같기도 하고, 다른 사람이 유지보수를 하게 되면 key값으로 접근하는게 더 쉬어보이므로 이런 방식을 선택했다.
// create ArrayCollection
var dataArrCol:ArrayCollection = new ArrayCollection;
// xml to ArrayCollection
dataArrCol = xmlToArray(xmlData);
public function xmlToArrayCol(xml:XML):ArrayCollection{
// variable set
var item:XML, value:XML, obj:Object;
var arrCol:ArrayCollection = new ArrayCollection;
//xml Parsing
for each(item in xml.children())
{
if(item.name() != "item")
continue;
obj = {};
for each(value in item.children())
{
// get name to using object key from xml and set data
obj[value.name()] = value.toString();
}
arrCol.addItem(obj);
}
// return ArrayCollection;
return arrCol;
}
만들어본 xml to ArrayCollection 함수
131 1 comjji 9 132 3 comjji 7 133 2 comjji 1 100
XML Data
각 item 별로 object에 넣은 뒤 arraycollection에 addItem! 원래는 array를 이용하려고 했는데 검쉰님의 글(ArrayCollection에 대한 이해) 을 읽어보니 array에서는 동적으로 아이템을 추가, 삭제하려면 splice를 이용해야 된다길래 ArrayCollection을 이용하였다. 게다가 arrayCollection에서는 아이템이 변경되었을 때 이벤트 처리가 가능하다고 하니 좀 더 낫겠지.
곁다리) 내가 검색을 못하는건지 자료가 부족한건지 모르겠지만, XML 파싱하여 그 데이터를 처리하고 이용하는 방법에 대해서 정리된 자료가 없었다. xml 데이터를 많이 가져다 쓸텐데; 왜 없을까.. 다른 분들은 어떻게 구현했는지 궁금하다.