TBXML
을 사용하여 XML 파일을 구문 분석하려고합니다. 그러나이 파서에는 오류 검사가 내장되어 있지 않으므로 요소가 없으면 충돌이 발생합니다. XML 파일 중 하나를 파싱하는 방법은 다음과 같습니다.무언가가 nil인지 확인하는 더 나은 방법은 무엇입니까?
TBXML *XML = [[TBXML tbxmlWithXMLData:myxmlfile] retain];
if (XML.rootXMLElement) {
TBXMLElement *XMLRoot = XML.rootXMLElement;
if ([TBXML childElementNamed:@"blah" parentElement:XMLRoot]) {
TBXMLElement *Blah = [TBXML childElementNamed:@"blah" parentElement:XMLRoot];
if ([TBXML childElementNamed:@"stuff" parentElement:Blah]) {
TBXMLElement *Item = [TBXML childElementNamed:@"item" parentElement:Blah;
if ([TBXML childElementNamed:@"stuff:blah" parentElement:Item]) {
TBXMLElement *something = [TBXML childElementNamed:@"stuff:blah" parentElement:Item];
NSString *Something = [TBXML textForElement:something];
//do something here...
}
else {
[self showFetchError];
[XML release];
return;}
} else {
[self showFetchError];
[XML release];
return;}
} else {
[self showFetchError];
[XML release];
return;}
} else {
[self showFetchError];
[XML release];
return;
}
위에서 보듯이 각 항목에 대해 두 번 전화를 겁니다. 그것은 저에게 오버 헤드의 거대한 낭비처럼 보입니다. 어떤 방식 으로든 지금 당장하고있는 일을 수행하지 않고도 각 항목에 대해 동일한 검증을 수행 할 수 있습니까? 열거를 사용
BOOL success = NO;
TBXML *XML = [[TBXML tbxmlWithXMLData:myxmlfile] retain];
if (XML.rootXMLElement) {
TBXMLElement *XMLRoot = XML.rootXMLElement;
if ([TBXML childElementNamed:@"blah" parentElement:XMLRoot]) {
TBXMLElement *Blah = [TBXML childElementNamed:@"blah" parentElement:XMLRoot];
if ([TBXML childElementNamed:@"stuff" parentElement:Blah]) {
TBXMLElement *Item = [TBXML childElementNamed:@"item" parentElement:Blah;
if ([TBXML childElementNamed:@"stuff:blah" parentElement:Item]) {
success = YES;
TBXMLElement *something = [TBXML childElementNamed:@"stuff:blah" parentElement:Item];
NSString *Something = [TBXML textForElement:something];
//do something here...
}
}
}
}
if (!success) {
[self showFetchError];
[XML release];
return;
}
업데이트 버전 :
음을. –
다른 해결책으로 내 대답을 업데이트했습니다. – Eimantas
이 솔루션으로 인해 많은 업데이트가 급하게 이루어졌습니다. 이제 컴파일해야합니다! – Eimantas