본문 바로가기

iPhone

APXML 를 사용 해 보세요.

iPhone SDK 에서 제공하는 Xml Parsing 을 사용하다 보면..' 좀 더 편한 방법으로 파싱 할 수 있는 라이브러리를 만들어 볼까?' 싶은 생각이 듭니다. (이럴 때 많으시죠?) 그렇다고, 맘만 먹으면 뚝딱 해 내느냐.. 그건 개인 재량마다 차이가 있겠지만, 아무래도 쉬이 되는 일은 아니죠. 시간 투자를 해야 하니깐요 :)

이럴 때, 저는 OpenSource 를 찾아봅니다. SAX 방식인지, DOM 방식인지.. 고려할 사항이 많겠지만, 저는 사용하기 쉬운 쪽에 중점을 두고 찾아봤어요. 그 중에 아는 지인께서 소개 해 준 APXML 을 서치 해 봤는데요, 다른 Xml Parser 보다 사용하기가 정말 쉽더라고요. 특히, 닷넷 플랫폼에 익숙한 저한텐 더욱 더 사용하기 편했습니다.

(참고로 인터넷에서 검색 해 보시면 정말 많은 OpenSource 가 존재하는데요, 많은 분들이 쓰고 계시는 Xml Parser 를 비교 해 놓은 사이트가 있더군요.  APXML 이외에 다른 Xml Parser 도 한 번 검토 해 보시라고, 링크 남깁니다. )

그럼 APXML 이 왜 편한가! 또한, 닷넷 플랫폼에 익숙하신 분들에게는 더욱 더 사용하기 편한 이유가 무엇인가.. 를 살펴 볼까요?

우선, APXML 을 다운 하세요.

APXML 은 APDocument, APElement 라는 클래스를 정의 합니다.
APDocument, APElement.. 닷넷 플랫폼을 경험하신 분들이라면.. XDocument, XElement 를 기억하시죠? 맞습니다. APDocument와 APElement 는 그대로, XDocument, XElement 와 같은 역할을 하는 클래스입니다. 정말 흡사하게 구현 해 놓았더군요. 덕분에, XML Parsing 을 구현하는데 있어, 마치 C#으로 구현하는 것과 같은 방법으로 할 수 있다는 장점이 있어요. (기존에 C#에서 XML Parsing 을 해 보신 분이라면)

APXML 을 이용해 Xml Parsing
1. iPhone Project에 APXML Source 추가
2. Xml Parsing 할 곳에서 APXML 라이브러리를 사용하기 위한 해더 추가
3. xml 을 NSString 객체에 할당.
4. APDocument 객체 생성. (1. 에서 할당 된 NSString 사용)
5. XML 구문에 맞게 APElement 를 조사하며 파싱
- 끝 -

너무 쉽죠? :)
순서대로 코드를 한 번 리뷰하시면, 충분 하실 것 같네요 :) 다음 코드를 참고 하세요~
1. iPhone Project 에 APXML Source 추가
  APXML 을 다운 하신 뒤, iPhone Project에 소스를 통째로 추가 해 주시면 됩니다.

2. Xml Parsing 할 곳에서 APXML 라이브러리를 사용하기 위한 header 추가
  #include "APXML.h" 만 코드에 추가 하시면 됩니다.
  (APXML.h 에서는 APDocument.h , APElement.h, APAttribute.h 해더가 추가 되 있거든요)

3. xml 을 NSString 객체에 할당.
 보통 웹에서 다운하시니, 코드를 웹에서 다운 받는 형태로 작성 해 볼께요.

NSString* xmlStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:xmlUrl]

encoding:NSUTF8StringEncoding error:nil];

  xmlUrl 만 입력하시면 되겠네요.

4. APDocument 객체 생성. (3. 에서 할당 된 NSString 사용)

APDocument* doc = [APDocument documentWithXMLString:xmlStr];

 APDocument 는 3번에서 할당 된 NSString 객체만 파라미터로 넘겨주시면 됩니다.

5. XML 구문에 맞게 APElement 를 조사하며 파싱
  - APElement 에서는 rootElement 라는 프로퍼티가 있어요. XML 문서의 Root 를 가져오게 됩니다.  반환 형식은 APElement 이고, 하위 엘리먼트들도 모두 포함하고 있습니다.  이 Root 를 베이스로, 하위 엘리먼트 요소를 XML 구문에 맞게 파싱하시면 되는 것이죠 :)

APElement* rootElement = [doc rootElement];


  - 또한, APElement 는 하위 엘리먼트 요소들을 childElements라는 프로퍼티를 통해 배열로 가지고 있습니다. 중요한 점은, 배열의 요소 각각 또한 APElement 라는 점입니다. 그래서, depth 가 아무리 깊더라도 파싱이 난해하지 않고 편하다는 것이죠 :)

NSArray* childElements = [rootElement childElements];

for(APElement* child in childElements) {

NSArray* memberElements = [child childElements];

MEMBER* obj = [[MEMBER alloc] init];

for(APElement* member in memberElements) {

// obj 객체 프로퍼티 할당

}

[members addObject:obj];

[obj release];

}


  - 마지막으로, 위 코드에서 주석처리 된 obj 객체 프로퍼티 할당 부분에 대해서 덧하자면.. (사실 이게 핵심이겠네요) Element 의 값을 가져오는 방식은 다음과 같습니다.

// 엘리먼트명을 가져옵니다.

// 예) <MEMBER id="1"> 에서 값 : MEMBER

[child name]

 

// 엘리먼트 내 Attribute의 값을 가져옵니다.

// 예) <MEMBER id="1"> 에서 값 : 1

[child valueForAttributeNamed:@"id"]

 

// 엘리먼트의 값을 가져옵니다. 

// 예) <PHONE>010-0505-7575</PHONE> 에서 값 : 010-0505-7575

[child value]


정말 쉽죠? 또한, XDocument 와 XElement 와도 매우 흡사합니다. 
XDocument - APDocument, 
XDocument.Root - [APDocument rootElement],
XElement - APElement
XElement.Elements - [APElement childElements]
위 4가지 사항이 너무나 매치가 되기 때문에 XDocument, XElement 를 사용해 보신 분들께는 더욱 더 추천 드리고 싶네요 ^^