[objective-c] RaptureXML 사용법

SMXMLDocument 로 작업을 하고 있었는데, 파싱이 너무 느리다….

전에는 느껴보지 못했던 엄청난 속도 저하와 엄청난 메모리 사용량….

용량이 작은 파일에서는 문제가 없는데, xml 파일 용량이 3메가 넘는 걸 로딩시켰더니 몇 초나 걸릴 정도였다.

 

너무나도 느려서 http://jansanchez.com/blog/2013/01/22/state-of-ios-xml-libraries-in-2013/ 에서 제일 빠르다고 하는 TBXML로 하려고 했는데, 얘는 배열처리하는게 너무 귀찮게 되어있다.

요즘 세상에 -> 를 사용하다니 ㄷㄷ

 

그래서 저 글에 나온 데로 RaptureXML로 예제를 만들어봤는데, TBXML 만큼 빠르고, SMXML보다 쓰기 쉽게 되어있다.

 

<TrainingCenterDatabase>
  <Activities>
    <Activity Sport="Biking">
      <Id>2012-04-29T00:04:51.000Z</Id>
      <Lap StartTime="2012-04-29T00:04:51.000Z">
        <TotalTimeSeconds>16462.779</TotalTimeSeconds>
        <DistanceMeters>117454.14</DistanceMeters>
        <MaximumSpeed>16.547000885009766</MaximumSpeed>
        <Calories>4200</Calories>
        <Intensity>Active</Intensity>
        <Cadence>79</Cadence>
        <TriggerMethod>Manual</TriggerMethod>
        <Track>
          <Trackpoint>
            <Time>2012-04-29T00:04:51.000Z</Time>
            <AltitudeMeters>2.4000000953674316</AltitudeMeters>
            <DistanceMeters>0.0</DistanceMeters>
            <Extensions>
              <TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
                <Speed>2.9670000076293945</Speed>
              </TPX>
            </Extensions>
          </Trackpoint>
          <Trackpoint>
            <Time>2012-04-29T00:04:52.000Z</Time>
            <AltitudeMeters>2.4000000953674316</AltitudeMeters>
            <DistanceMeters>1.4900000095367432</DistanceMeters>
            <Extensions>
              <TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
                <Speed>3.5950000286102295</Speed>
              </TPX>
            </Extensions>
          </Trackpoint>
        </Track>
      </Lap>
    </Activity>
  </Activities>
  <Author xsi:type="Application_t">
    <Name>Garmin Connect API</Name>
    <Build>
      <Version>
        <VersionMajor>13</VersionMajor>
        <VersionMinor>4</VersionMinor>
        <BuildMajor>0</BuildMajor>
        <BuildMinor>0</BuildMinor>
      </Version>
    </Build>
    <LangID>en</LangID>
    <PartNumber>006-D2449-00</PartNumber>
  </Author>
</TrainingCenterDatabase>

 

NSString *filePath = [[NSBundle mainBundle] bundlePath];
NSString *path = [[NSString alloc] initWithString:[filePath stringByAppendingPathComponent:@"activity_172801550.tcx"]];
NSData *data = [NSData dataWithContentsOfFile:path];
RXMLElement *root = [RXMLElement elementFromXMLData:data];
RXMLElement *activities = [root child:@"Activities"];
RXMLElement *activity = [activities child:@"Activity"];
RXMLElement *lap = [activity child:@"Lap"];
NSString* startTime = [lap attribute:@"StartTime"];

RXMLElement* totalTimeSeconds = [lap child:@"TotalTimeSeconds"];

RXMLElement* track = [lap child:@"Track"];
NSArray* trackPoints = [track children:@"Trackpoint"];

RXMLElement *author = [root child:@"Author"];
RXMLElement *name = [author child:@"Name"];
NSLog(@"total time : %@, start time : %@, name : %@, count : %d", totalTimeSeconds.text, startTime, name.text, trackPoints.count);
// total time : 16462.779, start time : 2012-04-29T00:04:51.000Z, name : Garmin Connect API, count : 2

SMXML로 작업하면서 속도저하를 유발시켰던 파일을 로딩해도 RXML에서는 아주 빠르게 파싱을 한다.