2012-01-11 14 views
5

Przeczytałem wiele przykładów, jak uzyskać tekst z plików xml, ale po prostu nie wiesz jak to zrobić. Oto przykładowy plik xml:Parsowanie xml w NSXMLParser

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

Korzystanie -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI, co jest najprostszym sposobem, aby uzyskać wartości Question i Answer? Mam już mojego delegata parsera i wszystko to blah.

Odpowiedz

13

za wdrażanie NSXMLParser trzeba zaimplementować metodę delegat niego.

Przede wszystkim zainicjuj NSXMLParser w ten sposób.

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

Powyższa metoda delegata jest wysyłana przez obiekt analizatora składni do jego uczestnika po napotkaniu końca określonego elementu. W tej metodzie didEndElement otrzymasz wartość question.

+1

Jeśli warunek jest pominięty w 'foundCharacters' :)' if (currentElementValue == zero) ' – GoodSp33d

+0

Czy ktoś ostatnio użył tego kodu? Otrzymuję "użycie niezadeklarowanego identyfikatora xmlParserObject" błędów. Czy brakuje IMPORTU? – user3741598

+0

@ user3741598 po prostu wykonaj NSXMLParser * xmlParserObject. Myślę, że w powyższym kodzie przykładowym parser deklaruje się najpierw w nagłówku, a więc nie trzeba go określać. Tak przynajmniej sądzę. –

2

Trzeba realizować wywołania zwrotne dla NSXMLParserDelegate

Najważniejsze z nich to:

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

Więc, kiedy trafisz elementy można ustawić stan czy parser jest obecnie w pytania lub odpowiedzi element (z iVar), a następnie, gdy zostanie wywołany z powrotem z foundCharacters, na podstawie stanu ustawionego po trafieniu elementu, wiesz, która zmienna (pytanie lub odpowiedź), aby przypisać dane.

2

Trzeba wdrożyć metodę

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

Po wyświetleniu elementów którego (wewnętrzna) Tekst, który chcesz pobrać, należy ustawić flagę w swoim programie i zachować ciąg z rzeczy, które foundCharacters znaleziska między tagi. Po kliknięciu na metodę didEndElement możesz zrobić, co chcesz, za pomocą ciągu znaków i zresetować flagę.

Na przykład

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

aw didEndElement można wyzerować flagę 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; 
    } 
}