2012-01-11 5 views
5

Я прочитал много примеров того, как получить текст из xml-файлов, но просто не понимаю, как это сделать. Вот пример XML-файл:Разбор xml в NSXMLParser

<?xml version="1.0" encoding="UTF-8"?> 
<questions> 
    <set> 
     <question>Question</question> 
     <answer>Answer</answer> 
    </set> 
</questions> 

Использование -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI, что самый простой способ, чтобы получить значения Question и Answer? У меня уже есть мой делегат парсера, подключенный и весь этот бла.

ответ

13

Для реализации NSXMLParser вам необходимо реализовать метод делегата от него.

Прежде всего инициируйте NSXMLParser таким образом.

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    rssOutputData = [[NSMutableArray alloc]init]; 

    //declare the object of allocated variable 
    NSData *xmlData=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@""]];// URL that given to parse. 

    //allocate memory for parser as well as 
    xmlParserObject =[[NSXMLParser alloc]initWithData:xmlData]; 
    [xmlParserObject setDelegate:self]; 

    //asking the xmlparser object to beggin with its parsing 
    [xmlParserObject parse]; 

    //releasing the object of NSData as a part of memory management 
    [xmlData release]; 

} 
//------------------------------------------------------------- 


-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName 
    attributes: (NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"question"]) 
    { 

     strquestion = [[NSMutableString alloc] init]; 

    } 
} 


//------------------------------------------------------------- 


-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
     // init the ad hoc string with the value  
    currentElementValue = [[NSMutableString alloc] initWithString:string]; 
    } else { 
    // append value to the ad hoc string  
    [currentElementValue appendString:string]; 
    } 
    NSLog(@"Processing value for : %@", string); 
} 


//------------------------------------------------------------- 


-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if([elementName isEqualToString:@"question"]) 
    { 
     [strquestion setString:elementName]; 
    } 

[currentElementValue release]; 
    currentElementValue = nil; 
} 

выше метод делегата отправляется объектом синтаксического анализа для его делегата, когда он сталкивается с концом конкретного элемента. В этом методе didEndElement вы получите значение question.

+1

Условие if отсутствует в 'foundCharacters' :)' if (currentElementValue == nil) ' – GoodSp33d

+0

Кто-нибудь использовал этот код недавно? Я получаю «использование необъявленных идентификаторов xmlParserObject». Отсутствует ли ИМПОРТ? – user3741598

+0

@ пользователь3741598 как раз делает NSXMLParser * xmlParserObject. Я думаю, что в примере кода выше анализатор сначала объявляется в заголовке, поэтому не нужно указывать его тип. По крайней мере, это мое предположение. –

2

Вы должны выполнить обратные вызовы для NSXMLParserDelegate

Ключевыми из них являются:

// called when it found an element - in your example, question or answer 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 

// called when it hits the closing of the element (question or answer) 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 

// called when it found the characters in the data of the element 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 

Итак, когда вы попали элементы, вы можете установить состояние ли парсер в настоящее время вопрос или ответ (с iVar), а затем, когда вы получаете обратный вызов с foundCharacters, в зависимости от состояния, которое вы устанавливаете, когда вы нажимаете на элемент, вы знаете, какую переменную (вопрос или ответ) присваивать данные.

2

Вам необходимо реализовать метод

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 

После того, как вы видите, элементы которого (внутренний) текст, который вы хотите, чтобы захватить, установить флаг в вашей программе, и сохранить строку с вещами, которые foundCharacters находками между теги. Как только вы нажмете на didEndElement, вы можете сделать то, что хотите, со строкой и сбросить флаг.

Например

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (sawQuestion) { 
    // need to check here that self->myString has been initialized 
    [self->myString appendString:string]; 
} 
} 

и didEndElement вы можете сбросить флаг sawQuestion

3
// This one called out when it hit a starting tag on xml in your case <question> 

    BOOL got = FALSE; 

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 

{ 

     if([elementName isEqualToString:@"question"]) 
     { 
     got = TRUE; 
     } 
} 

// This is third one to called out which gives the end tag of xml in your case </question> 


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



// This delegate is the second one to called out which gives the value of current read tag in xml 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 

    if(got) 
    { 
    NSLog(@"your desired tag value %@",string); 
    got = FALSE; 
    } 
} 
Смежные вопросы