Разбор xml в NSXMLParser - PullRequest
       36

Разбор xml в NSXMLParser

5 голосов
/ 11 января 2012

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

<?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? У меня уже есть подключенный делегат парсера и все такое, бла.

Ответы [ 4 ]

13 голосов
/ 11 января 2013

Для реализации 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.

3 голосов
/ 18 апреля 2012
// 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; 
  }
}
2 голосов
/ 11 января 2012

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

-(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

2 голосов
/ 11 января 2012

Вы должны реализовать обратные вызовы для 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, основываясь на состоянии, которое вы установили при нажатии элемент, вы знаете, какой переменной (вопрос или ответ) назначить данные.

...