Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 105

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

Рис. 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{