Π ΠΈΡ. 11.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΠ²ΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Social
ΠΠ±Π»Π°Π΄Π°Ρ ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈ ΡΠ°Π·Π½ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄Π»Ρ ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Facebook. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΡΠ½ΡΠ»ΠΎΡΡ ΡΠ°Π½Π΅Π΅, Π²Π°ΠΌ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π»ΠΈ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ ΠΈΡΠΊΠΎΠΌΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ, Π° ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌ β Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ΅ ΡΠ΅ΠΊΡΡ, ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, URL.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅, ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²Π°ΡΠΈΡ Π²ΠΈΠ΄ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄Π»Ρ ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π΅ Π² ΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²Ρ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ. ΠΡΠ°ΠΊ, ΠΏΠΎΠΌΠ½Ρ ΠΎΠ± ΡΡΠΎΠΌ, ΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΠΏΡΠΈΠ΅ΠΌΠ°ΠΌΠΈ, ΠΈΠ·ΡΡΠ΅Π½Π½ΡΠΌΠΈ Π² Π³Π»Π°Π²Π΅ 7, ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ΡΡ Π½Π° ΡΠ°Π±ΠΎΡΡ Ρ Π³Π»Π°Π²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ, ΠΈΠΌΠ΅ΡΡΠ΅Π΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ.
Π‘ΠΌ. ΡΠ°ΠΊΠΆΠ΅
Π Π°Π·Π΄Π΅Π» 11.0.
11.12. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ XML Ρ ΠΏΠΎΠΌΠΎΡΡΡ NSXMLParser
ΠΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°ΡΠΈ
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ (ΠΏΠ°ΡΡΠΈΠ½Π³) ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠ΄Π° Π½Π° ΡΠ·ΡΠΊΠ΅ XML ΠΈΠ»ΠΈ XML-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
Π Π΅ΡΠ΅Π½ΠΈΠ΅
ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΠΊΠ»Π°ΡΡΠΎΠΌ NSXMLParser.
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅
ΠΠ»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° XML-ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡ NSXMLParser ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π΅Π»Π΅Π³Π°Ρ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ XML-ΡΠ°ΠΉΠ», ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ (ΡΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΊΠ°ΠΊ MyXML.xml):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<person id="1">
<firstName>Anthony</firstName>
<lastName>Robbins</lastName>
<age>51</age>
</person>
<person id="2">
<firstName>Richard</firstName>
<lastName>Branson</lastName>
<age>61</age>
</person>
</root>
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠΈΠΏΠ° NSXMLParser:
#import Β«AppDelegate.hΒ»
@interface AppDelegate () <NSXMLParserDelegate>
@property (nonatomic, strong) NSXMLParser *xmlParser;
@end
@implementation AppDelegate
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ» Π΄Π΅Π»Π΅Π³Π°Ρ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ Π΄Π΅Π»Π΅Π³Π°Ρ XML-ΠΏΠ°ΡΡΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ NSXMLParserDelegate. Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΡΠΎΠΌΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π΅Π»Π΅Π³Π°ΡΠ° XML-ΠΏΠ°ΡΡΠ΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ½ΠΎΡΠΈΡΡΡΡ ΠΊ ΡΠΈΠΏΡ NSXMLParser. CΡΠΈΡΠ°Π΅ΠΌ Ρ Π΄ΠΈΡΠΊΠ° ΡΠ°ΠΉΠ» MyXML.xml ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π² XML-ΠΏΠ°ΡΡΠ΅Ρ:
β (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:@"MyXML"
ofType:@"xml"];
NSData *xml = [[NSData alloc] initWithContentsOfFile: xmlFilePath];
self.xmlParser = [[NSXMLParser alloc] initWithData: xml];
self.xmlParser.delegate = self;
if ([self.xmlParser parse]){
NSLog(@"The XML is parsed.");
} else{
NSLog(@"Failed to parse the XML");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Π‘Π½Π°ΡΠ°Π»Π° ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ NSData, Π° ΠΏΠΎΡΠΎΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ XML-ΠΏΠ°ΡΡΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° initWithData:, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΡΡΠΈΡΠ°Π½Π½ΡΠ΅ ΠΈΠ· XML-ΡΠ°ΠΉΠ»Π°. ΠΠ°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ parse XML-ΠΏΠ°ΡΡΠ΅ΡΠ°, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ°. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ. ΠΡΠ»ΠΈ Π²Π°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ Π±ΠΎΠ»ΡΡΠΈΡ XML-ΡΠ°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΡΠΊΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ.
ΠΠ»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° XML-ΡΠ°ΠΉΠ»Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ NSXMLParserDelegate, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, Π·Π° ΡΡΠΎ ΠΎΠ½ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ:
β’ parserDidStartDocument: β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ°;
β’ parserDidEndDocument: β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ°;
β’ parser: didStartElement: namespaceURI: qualifiedName: attributes: β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΡΡΠ΅Ρ Π²ΡΡΡΠ΅ΡΠ°Π΅Ρ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² XML-Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅;
β’ parser: didEndElement: namespaceURI: qualifiedName: β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΡΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°;
β’ parser: foundCharacters: β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΡΡΠ΅Ρ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π΅Π»Π΅Π³Π°ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π»Ρ XML-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ XML-ΡΠ»Π΅ΠΌΠ΅Π½Ρ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ XMLElement:
#import <Foundation/Foundation.h>
@interface XMLElement: NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *text;
@property (nonatomic, strong) NSDictionary *attributes;
@property (nonatomic, strong) NSMutableArray *subElements;
@property (nonatomic, weak) XMLElement *parent;
@end
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡ XMLElement:
#import Β«XMLElement.hΒ»
@implementation XMLElement
β (NSMutableArray *) subElements{
if (subElements == nil){
subElements = [[NSMutableArray alloc] init];
}
return subElements;
}
@end
ΠΡ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΌΠ°ΡΡΠΈΠ² subElements ΡΠΎΠ·Π΄Π°Π²Π°Π»ΡΡ Π»ΠΈΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ ΡΡΠΎΠΉ ΡΠΎΡΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ nil. ΠΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ΄ Π΄Π»Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° subElements ΠΊΠ»Π°ΡΡΠ° XMLElement ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ Π² Π΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅-ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Π΅. ΠΡΠ»ΠΈ Ρ XML-ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π½Π΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ. ΠΠ΅Π΄Ρ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠΎΡΠΊΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. Π’Π°ΠΊΠ°Ρ ΡΠ΅Ρ Π½ΠΈΠΊΠ° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Β«Π»Π΅Π½ΠΈΠ²ΠΎΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅Β» (Lazy Allocation).
ΠΡΠ°ΠΊ, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ. ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ XMLElement ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ rootElement. ΠΠ°Ρ ΠΏΠ»Π°Π½ β Π½Π°ΡΠ°ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΈΠ·ΡΡΠΈΡΡ XML-ΡΠ°ΠΉΠ» ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΡΠ°Π·Π±ΠΎΡΠ° Π΅Π³ΠΎ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΅Π³ΠΎ Π΄Π΅Π»Π΅Π³Π°ΡΠ°, ΠΏΠΎΠΊΠ° Π½Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²Π΅ΡΡ ΡΠ°ΠΉΠ» ΡΠ΅Π»ΠΈΠΊΠΎΠΌ:
#import Β«AppDelegate.hΒ»
#import Β«XMLElement.hΒ»
@interface AppDelegate () <NSXMLParserDelegate>
@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, strong) NSXMLParser *xmlParser;
@property (nonatomic, strong) XMLElement *rootElement;
@property (nonatomic, strong) XMLElement *currentElementPointer;
@end
@implementation AppDelegate
currentElementPointer Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΎΠΌΡ XML-ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌ Π² XML-ΡΡΡΡΠΊΡΡΡΠ΅. Π Ρ ΠΎΠ΄Π΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΏΠΎ ΡΡΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ Π²Π²Π΅ΡΡ ΠΈ Π²Π½ΠΈΠ·. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠ΅Π³ΠΎΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ currentElementPointer, rootElement Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π²Π°ΡΡΡΡ ΠΊΠΎΡΠ½Π΅Π²ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ XML-ΡΠ°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ Π² Ρ ΠΎΠ΄Π΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
ΠΠ°ΡΠ½Π΅ΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ. ΠΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ, β ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ parserDidStartDocument:. Π Π½Π΅ΠΌ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
β (void)parserDidStartDocument:(NSXMLParser *)parser{
self.rootElement = nil;
self.currentElementPointer = nil;
}
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ parser: didStartElement: namespaceURI: qualifiedName: attributes:. Π ΡΡΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (Π΅ΡΠ»ΠΈ ΠΎΠ½ Π΅ΡΠ΅ Π½Π΅ ΡΠΎΠ·Π΄Π°Π½). ΠΠΎΠ³Π΄Π° Π² XML-ΡΠ°ΠΉΠ»Π΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠ°Π·Π±ΠΎΡ Π»ΡΠ±ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΌΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΡΡΡΠΊΡΡΡΠ΅ XML-ΡΠ°ΠΉΠ»Π° Π½Π°Ρ ΠΎΠ΄ΠΈΠΌΡΡ, Π° ΠΏΠΎΡΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ-ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ-ΠΎΠ±ΡΠ΅ΠΊΡΡ:
β (void) parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict{
if (self.rootElement == nil){
/* Π£ Π½Π°Ρ Π½Π΅Ρ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΊΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
ΠΈ ΡΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° Π½Π΅Π³ΠΎ. */
self.rootElement = [[XMLElement alloc] init];
self.currentElementPointer = self.rootElement;
} else {
/* ΠΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΆΠ΅ Π΅ΡΡΡ. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. */
XMLElement *newElement = [[XMLElement alloc] init];
newElement.parent = self.currentElementPointer;
[self.currentElementPointer.subElements addObject: newElement];
self.currentElementPointer = newElement;
}
self.currentElementPointer.name = elementName;
self.currentElementPointer.attributes = attributeDict;
}
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄ parser: foundCharacters:. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΡΡΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΡΠ΅ΠΊΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠΌΠ΅Π΅Ρ 4000 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π² Π΄Π»ΠΈΠ½Ρ, ΡΠΎ ΠΏΠ°ΡΡΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1000 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π·Π° ΠΏΠ΅ΡΠ²ΡΠΉ Ρ ΠΎΠ΄, Π΅ΡΠ΅ 1000 β Π·Π° Π²ΡΠΎΡΠΎΠΉ ΠΈ Ρ. Π΄. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ parser: foundCharacters: Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠ΅ΡΡΡΠ΅ ΡΠ°Π·Π°. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ Π°ΠΊΠΊΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΠΈΡ Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊΠΈ:
β (void) parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string{