OS X, HTTP로 XML 데이터 요청 예제
오래 간만에 포스팅합니다. 요즘 트위터 때문에 블로그에 소홀해진 것도 있지만 아이폰과 안드로이드 애플케이션(이하, 앱) 개발에 여념이 없습니다. 스마트폰 대세라 흐름을 따라 가는 것도 있지만 주로 웹 서비스만 개발하다 보니 오래 간만에 접하는 애플리케이션 형태의 제품 개발 자체가 매우 흥미롭습니다.
그런데 요즘 왠만한 앱에는 HTTP를 통해서 XML 데이터를 가져와서 보여주는 기능이 들어가는 데 막상 개발 참고하려고 구글 검색해보면 마땅한 예제가 없어서 간단하게 예제를 작성해보았습니다.
요청하는 XML 문서(hello.xml)는 아래와 같이 작성했습니다.
<?xml version="1.0" encoding="UTF-8" ?> <showrooms> <showroom><name>강남전시장</name><phone_number>02-111-1111</phone_number></showroom> <showroom><name>삼성전시장</name><phone_number>02-222-2222</phone_number></showroom> <showroom><name>한남전시장</name><phone_number>02-333-3333</phone_number></showroom> </showrooms>
해당 XML 데이터를 HTTP를 통해서 가져와서 처리하는 예제는 아래와 같습니다. 간단하게 실행 되는 것을 확인하기 위해서 컨솔 창에서 돌아가도록 작성했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #import <Foundation/Foundation.h> int main( int argc, char* argv[] ) { NSAutoreleasePool* pool = [ NSAutoreleasePool new ]; NSURL* url = [ NSURL URLWithString: @"http://www,yourserver.com/hello.xml" ]; NSError* error; NSXMLDocument* xmlDocument = [ [ NSXMLDocument alloc ] initWithContentsOfURL: url options: ( NSXMLNodePreserveWhitespace | NSXMLNodePreserveCDATA ) error: &error ]; if ( nil != error ) { NSLog( @"%@", [ error localizedDescription ] ); [ pool drain ]; return 0; } NSXMLNode* rootElement = [ xmlDocument rootElement ]; NSArray* showrooms = [ rootElement children ]; int i, count = [ showrooms count ]; for ( i = 0; i < count; ++i ) { NSXMLNode* showroomNode = [ showrooms objectAtIndex: i ]; NSXMLNode* nameNode = [ showroomNode childAtIndex: 0 ]; NSArray* nodes = [ showroomNode nodesForXPath: @"phone_number" error: nil ]; NSXMLNode* phoneNumberNode = nil; if ( 1 == [ nodes count ] ) { phoneNumberNode = [ nodes objectAtIndex: 0 ]; } NSLog( @"%@ (%@)", [ nameNode stringValue ], [ phoneNumberNode stringValue ] ); } [ xmlDocument release ]; [ url release ]; [ pool drain ]; return 0; } |
예제에서 특별히 어려운 내용은 없습니다. NSXMLDocument 클래스가 HTTP를 지원하기 때문에 initWithContentsOfURL 메소드를 호출하기만 하면 됩니다. 그리고 아이폰 런타임 환경에서는 가비지 컬렉션이 지원되지 않기 때문에 NSAutoreleasePool 클래스를 이용해서 메모리 관리를 하였습니다.
예제에서 3가지 다른 방법으로 자식 노드에 접근하고 있습니다. 각각 children, objectAtIndex, nodesForXPath 메소드를 이용합니다. 가장 일반적인 방법은 nodesForXPath을 이용하는 방법입니다. 약간의 성능 문제가 있을 수도 있지만 대부분의 경우 처리하는 XML 데이터의 량이 많이 않기 때문에 신경 쓰지 않아도 될 듯 합니다. 반면 objectAtIndex 메소드를 사용하는 경우 성능은 향상될 수 있겠지만 XML 문법에 종속적이기 때문에 그리 권장할만한 방법은 아닙니다.
해당 파일을 컴파일하는 쉘 구문은 아래와 같습니다.
$ gcc -framework Foundation hello.m -o hello
실행 결과 화면은 아래와 같습니다.
$ ./hello 강남전시장 (02-111-1111) 삼성전시장 (02-222-2222) 한남전시장 (02-333-3333)
프로그래밍에 도움되길 바랍니다~
[ 수정 사항 ]
조사해 본 결과 NSXMLDocument 클래스는 iPhone SDK에 제외되어 있습니다. 따라서 위 예제는 OS X 애플리케이션에서만 동작합니다. 빠른 시일 내에 iPhone에서 돌아가는 예제를 작성해서 올리도록 하겠습니다. iPhone은 iPhone, HTTP로 XML 데이터 요청 및 처리 예제를 참고하세요~

초보자인 저에갠 큰 도움이 됐습니다…^^
감사합니다.
@양기열 도움이 되셨다니 열심히 쓴 보람을 느낍니다~ ㅎ
좋은 예제 감사합니다.!
아…. 한참 NSXMLDocument 프레임워크 찾았다는 OS X 만 지원이네요. ㅎㅎ ;;