Xcode에서 XML 파일을 구문 분석하는 방법

많은 애플리케이션에서 중추적 인 한 가지 간단한 작업은 XML 파일을 구문 분석하는 기능입니다. 그리고 다행스럽게도 Xcode는 Objective-C에서 XML 파일을 비교적 쉽게 파싱합니다.

XML 파일은 앱에 대한 기본 데이터에서 웹 사이트 용 RSS 피드 에 이르기까지 모든 것을 포함 할 수 있습니다. 또한 앱 내에서 정보를 원격으로 업데이트 할 수있는 좋은 방법이기도하므로 단순히 목록에 새 항목을 추가하기 위해 Apple에 새 바이너리를 제출해야 할 필요가 없습니다.

그렇다면 Xcode에서 XML 파일을 어떻게 처리 할 것인가? 프로세스에는 사용할 변수를 초기화하고, XML 파서 프로세스를 시작하고, 프로세스에 파일을 제공하고, 개별 요소의 시작, 요소 내의 문자 (값) 개별 요소의 끝 및 파싱 프로세스의 끝을 표시합니다.

이 예에서는 특정 웹 주소 ( URL )를 전달하여 인터넷에서 파일을 파싱합니다.

헤더 파일을 만드는 것으로 시작하겠습니다. 다음은 파일을 구문 분석하기위한 최소 요구 사항이있는 Detail View Controller에 대한 매우 기본적인 헤더 파일의 예입니다.

@interface RootViewController : UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * articles;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (비 원자, 유지) IBOutlet DetailViewController * detailViewController;

- (void) parseXMLFileAtURL : (NSString *) URL;

parseXMLFileAtURL 함수는 우리를 위해 프로세스를 시작합니다. 작업이 완료되면 NSMutableArray "articles"이 우리의 데이터를 보유하게됩니다. 배열은 XML 파일의 필드 이름과 관련된 키를 사용하여 변경 가능한 사전으로 구성됩니다.

이제는 필요한 변수를 설정 했으므로 .m 파일의 프로세스를 살펴 보겠습니다.

- (void) parserDidStartDocument : (NSXMLParser *) 파서 {
NSLog (@ "파일 발견 및 구문 분석 시작됨");

}

이 함수는 프로세스가 시작될 때 실행됩니다. 이 함수에는 아무 것도 넣지 않아도되지만 파일을 파싱하기 시작할 때 작업을 수행하려는 경우 여기에 코드를 넣습니다.

- (void) parseXMLFileAtURL : (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U, Intel Mac OS X 10_5_6; ko-ko) AppleWebKit / 525.27.1 (Gecko와 같은 KHTML) 버전 / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * 요청 = [NSMutableURLRequest requestWithURL :
[NSURL URLWithString : URL]];
[요청 setValue : agentString forHTTPHeaderField : @ "사용자 - 에이전트"];
xmlFile = [NSURLConnection sendSynchronousRequest : requestResponse 요청 : nil 오류 : nil];


articles = [[NSMutableArray alloc] init];
errorParsing = NO;

rssParser = [[NSXMLParser alloc] initWithData : xmlFile];
[rssParser setDelegate : self];

// 파싱 할 XML 파일의 유형에 따라 이들 중 일부를 켜야 할 수도 있습니다.
[rssParser setShouldProcessNamespaces : NO];
[rssParser setShouldReportNamespacePrefixes : NO];
[rssParser setShouldResolveExternalEntities : NO];

[rssParser parse];

}

이 함수는 엔진이 특정 웹 주소 (URL)에서 파일을 다운로드하고 파싱 프로세스를 시작하도록 지시합니다.

우리는 서버가 모바일 버전으로 iPhone / iPad 를 리디렉션하려고하는 경우를 대비해서 원격 서버에 Mac에서 실행되는 Safari라고 말합니다.

마지막 옵션은 특정 XML 파일에만 적용됩니다. 대부분의 RSS 파일과 일반 XML 파일은 켜져 있지 않아도됩니다.

- (void) 파서 : (NSXMLParser *) 파서 parseErrorOccurred : (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat : @ "오류 코드 % i", [parseError code]];
NSLog (@ "오류 구문 분석 XML : % @", 오류 문자열);


errorParsing = YES;
}

오류가 발생하면 이진 값을 설정하는 간단한 오류 검사 라우팅입니다. 당신이하고있는 일에 따라 더 구체적인 것을 필요로 할 수도 있습니다. 오류가 발생했을 때 처리 한 후 일부 코드 만 실행하면 해당 시점에 errorParsing 2 진 변수를 호출 할 수 있습니다.

- (void) 파서 : (NSString *) parser didStartElement : (NSString *) elementName namespaceURI : (NSString *) namespaceURI qualifiedName : (NSString *) qName 속성 : (NSDictionary *) attributeDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString : @ "item"])) {
item = [[NSMutableDictionary alloc] init];

}

}

XML 구문 분석기의 기능에는 개별 요소의 시작 부분에서 실행되는 기능, 요소를 구문 분석하는 중간에 실행되는 기능 및 요소의 끝에서 실행되는 기능이 있습니다.

이 예에서는 XML 파일의 "items"제목 아래에있는 요소를 그룹으로 분류하는 RSS 파일과 유사한 파일을 파싱합니다. 처리가 시작될 때 새 그룹이 감지 될 때 요소 이름 "item"을 확인하고 항목 사전을 할당합니다. 그렇지 않으면 값에 대한 변수를 초기화합니다.

- (void) parser : (NSXMLParser *) 파서 foundCharacters : (NSString *) string {
[ElementValue appendString : string];
}

이것은 쉬운 부분입니다. 문자를 찾으면 변수 "ElementValue"에 문자를 추가하기 만하면됩니다.

- (void) 파서 : (NSXMLParser *) 파서 didEndElement : (NSString *) elementName namespaceURI : (NSString *) namespaceURI qualifiedName : (NSString *) qName {
if ([elementName isEqualToString : @ "item"])) {
[articles addObject : [항목 복사]];
} else {
[item setObject : ElementValue forKey : elementName];
}

}

요소 처리가 완료되면 다음 두 가지 중 하나를 수행해야합니다. (1) 끝 요소가 "항목"인 경우 그룹을 완료 했으므로 우리 사전을 기사 배열에 추가합니다 ".

또는 (2) 요소가 "item"이 아닌 경우 요소의 이름과 일치하는 키를 사용하여 사전에 값을 설정합니다. 즉, XML 파일의 각 필드에 개별 변수가 필요하지 않으며 동적으로 처리 할 수 ​​있습니다.

- (void) parserDidEndDocument : (NSXMLParser *) 파서 {

if (errorParsing == NO)
{
NSLog (@ "XML processing done!");
} else {
NSLog (@ "XML 처리 중에 오류가 발생했습니다");
}

}

이것은 파싱 루틴에 필요한 마지막 함수입니다. 문서를 끝내기 만하면됩니다. 여기에서 프로세스를 끝내기 원하는 코드 또는 오류 발생시 수행하고자하는 특별한 코드를 넣을 것입니다.

많은 애플 리케이션 중 하나는 데이터 및 / 또는 XML 파일을 장치의 파일에 저장하는 것입니다. 그렇게하면 사용자가 다음 번에 앱을로드 할 때 인터넷에 연결되어 있지 않으면 여전히이 정보를 얻을 수 있습니다.

물론, 우리는 가장 중요한 부분을 잊을 수 없습니다 : 파일을 구문 분석하도록 응용 프로그램에 지시하고 웹 주소를 제공하여 찾도록하십시오!).

프로세스를 시작하려면이 코드 줄을 XML 처리를 수행하려는 적절한 위치에 추가하기 만하면됩니다.

[self parseXMLFileAtURL : @ "http://www.webaddress.com/file.xml"];