2014-04-14 2 views
1

먼저 올바른 용어가 아니라면 사용하십시오. 나는 파싱이 어떻게 작동하는지 알아보기 위해 샌프란시스코 BART 시스템에서 XML 피드를 구문 분석하여 UITableView로 이동하고 있습니다. 아래의 간단한 피드를 구문 분석하는 것은 꽤 간단합니다.NSXMLParser를 사용하여 다중 레벨 XML 구문 분석

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <uri><![CDATA[ http://api.bart.gov/api/sched.aspx?cmd=special ]]></uri> 
    <holidays> 
    <holiday> 
     <name>New Year's Day (2009)</name> 
     <date>01/01/2009</date> 
     <schedule_type>Sunday</schedule_type> 
    </holiday> 
    <holiday> 
     <name>Presidents' Day</name> 
     <date>02/16/2009</date> 
     <schedule_type>Saturday</schedule_type> 
    </holiday> 

나는 꽤 확신하고 있습니다. 문제는 이제 다음과 같은 좀 더 복잡한 형식으로 이동했습니다.

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <uri><![CDATA[ http://api.bart.gov/api/etd.aspx?cmd=etd&orig=RICH ]]></uri> 
    <date>03/30/2011</date> 
    <time>02:43:27 PM PDT</time> 
    <station> 
    <name>Richmond</name> 
    <abbr>RICH</abbr> 
    <etd> 
    <destination>Fremont</destination> 
    <abbreviation>FRMT</abbreviation> 
    <estimate> 
     <minutes>5</minutes> 
     <platform>2</platform> 
     <direction>South</direction> 
     <length>6</length> 
     <color>ORANGE</color> 
     <hexcolor>#ff9933</hexcolor> 
     <bikeflag>1</bikeflag> 
    </estimate> 
    <estimate> 
    <minutes>20</minutes> 
     <platform>2</platform> 
     <direction>South</direction> 
     <length>6</length> 
     <color>ORANGE</color> 
     <hexcolor>#ff9933</hexcolor> 
     <bikeflag>1</bikeflag> 
    </estimate> 
    </etd> 
    <etd> 
    <destination>Millbrae</destination> 
    <abbreviation>MLBR</abbreviation> 
    <estimate> 
     <minutes>Leaving</minutes> 
     <platform>2</platform> 
     <direction>South</direction> 
     <length>10</length> 
     <color>RED</color> 
     <hexcolor>#ff0000</hexcolor> 
     <bikeflag>1</bikeflag> 
    </estimate> 
    </etd> 
</station> 
<message /> 
</root> 

나는 데 실제 문제는이 더 복잡한 구조이기 때문에 didStartdidEnd 방법에 내있는 tableview를 채우는 배열을 구축하는 방법이다. (I 도움을 요청 올 정도로 좌절 도착하기 전에 끝 재판을)은 다음과 내가 위의 각 요소에 대해 별도의 배열을 만드는 것을 이해 꽤 멀리

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 


element = elementName; 

if ([element isEqualToString:@"station"]) { 

    station = [[NSMutableDictionary alloc] init]; 
    name = [[NSMutableString alloc] init]; 

} 

if ([element isEqualToString:@"etd"]) { 

    etd = [[NSMutableDictionary alloc] init]; 
    destination = [[NSMutableString alloc] init]; 

} 

if ([element isEqualToString:@"estimate"]) { 

    estimate = [[NSMutableDictionary alloc] init]; 
    minutes = [[NSMutableString alloc] init]; 
} 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

if ([elementName isEqualToString:@"station"]) { 
    [station setObject:name forKey:@"name"]; 

    [data addObject:[station copy]]; 

} 

if ([elementName isEqualToString:@"etd"]) { 
    [etd setObject:destination forKey:@"destination"];   
    //[data addObject:[etd copy]]; 

} 

if ([elementName isEqualToString:@"estimate"]) { 
    [estimate setObject:minutes forKey:@"minutes"]; 
    //[data addObject:[estimate copy]]; 
} 
} 

올바른

에서 그대로 내가 가지고하는 것입니다. 최종 목표는 역 이름에서 목적지까지 "x 분"으로 출발하는 것입니다. 또한 나는 대부분의 마법이 나를 위해 일어나는 XCODE를 사용하지 않는다. 간단한 XML을 파싱하기위한 많은 튜토리얼이있다. 그래서 다른 구조체를 사용하라는 제안과 함께 간단한 구조와 관련된 많은 질문이있다. 이것들은 나를위한 옵션이 아니며, XCODE 나 IB가없는 순수한 코드로 제한됩니다. 최종 질문은 데이터 구조를 드릴 다운 할 수 있도록 최종 배열을 작성하는 방법입니다.

답변

0

멀리 걷고 신선한 마음으로 돌아 오는 것처럼 보이는 것은 여전히 ​​놀라운 일입니다. 이것이 내가 생각해 낸 해결책이다. 그리 어렵지 않습니다.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 


element = elementName; 

if ([element isEqualToString:@"station"]) { 

    stationArray = [[NSMutableArray alloc] init]; 

    station = [[NSMutableDictionary alloc] init]; 
    name = [[NSMutableString alloc] init]; 

} 

else if ([element isEqualToString:@"etd"]) { 

    destinationArray = [[NSMutableArray alloc] init]; 
    destination = [[NSMutableString alloc] init]; 

} 

else if ([element isEqualToString:@"estimate"]) { 

    estimateArray = [[NSMutableArray alloc] init]; 
    minutes = [[NSMutableString alloc] init]; 


} 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

///// Add Arrays to Dictionary, then Copy back to Array that sorts the Table 

if ([elementName isEqualToString:@"station"]) { 
    [station setObject:name forKey:@"name"]; 
    [station setObject:destinationArray forKey:@"destination"]; 
    [station setObject:estimateArray forKey:@"minutes"]; 
    [data addObject:[station copy]]; 

} 

///// Add Destinations to an array 

else if ([elementName isEqualToString:@"etd"]) { 
    [destinationArray addObject:destination]; 


} 

///// Add minutes to an array 

else if ([elementName isEqualToString:@"estimate"]) { 
    [estimateArray addObject:minutes]; 


} 

} 
0

이것은 직접적인 대답은 아니지만, 경험상 NSXMLParser는 정말 어렵습니다. xml을 파고 들자면 솔루션은 항상 XMLDictionary입니다. 이 문제는 당신의 문제를 해결하지 못한다. 그러나 XMLDictionary는 NSXMLParser를 사용하므로 파일을 다운로드하면 더 복잡한 XML 구조를 처리하는 방법을 볼 수있다.

NSString *googleString = @"http://www.google.com/"; // your xml url 
NSDictionary *xml = [NSDictionary dictionaryWithXMLString:googleString]; 

그런 다음 당신은 당신이 원하는 데이터를 검색하는 사전을 통해 팔 수 있습니다 "XMLDictionary.h을"# import를 기억 XMLDictionary 예.

+0

나는 진술서를 작성하고 최종 배열에 추가 할 새로운 배열을 놓치고 있지만이 시점에서 나는 그것을 구현하는 방법을 잘 모르겠다. 무의미한 어떤 개념도없는 추측 모드에서 여기에 – Chilly

+0

은 .m 파일에 대한 링크입니다. 복사하고자하는 모든 것을하는 방법을 보여줍니다 : 3 –

+0

https://github.com/nicklockwood/XMLDictionary /blob/master/XMLDictionary/XMLDictionary.m –