2013-03-02 12 views
6
<root> 
    <table name="radios"> 
     <column name="nameradio">Radio1</column> 
     <column name="logo">http://app.syndicationradio.fr/demo/logo1.png</column> 
     <column name="stream">http://cloud2.syndicationradio.fr:8020</column> 
     <column name="twitter">http://www.twitter.com/#syndicationradio</column> 
     <column name="facebook">http://www.facebook.com/syndicationradio</column> 
     <column name="titre">http://app.syndicationradio.fr/demo/title.xml</column> 
    </table> 
    <table name="radios"> 
     <column name="nameradio">Radio2</column> 
     <column name="logo">http://app.syndicationradio.fr/demo/logo1.png</column> 
     <column name="stream">http://cloud2.syndicationradio.fr:8020</column> 
     <column name="twitter">http://www.twitter.com/#syndicationradio</column> 
     <column name="facebook">http://www.facebook.com/syndicationradio</column> 
     <column name="titre">http://app.syndicationradio.fr/demo/title.xml</column> 
    </table> 
</root> 

Bitte jetzt ist es jemand Hilfe, um das herauszufinden, wie kann ich die URL aus den XML-Daten erhalte NSXMLParser oder anderen XML-Parser annimmt TBXML in IOS?Wie kann ich dieses XML mit NSXMLParser in iOS analysieren?

Edit: Sie können mir auch Beispiel für libxml Parser für dieses XML geben.

Dank Im Voraus.

Antwort

18

zu diesem

- (void)viewDidLoad 

    { 
     NSURL *url = [[NSURL alloc]initWithString:@"yourURL"]; 
     NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:url]; 
     [parser setDelegate:self]; 
     BOOL result = [parser parse]; 
    } 

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
    { 
     NSLog(@\"Did start element\"); 
    if ([elementName isEqualToString:@"root"]) 
    { 
     NSLog(@"found rootElement"); 
     return; 
    } 
    } 

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
    { 
     NSLog(@"Did end element"); 
     if ([elementName isEqualToString:@"root"]) 
      { 
       NSLog(@"rootelement end"); 
      } 

    } 
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
    { 
     NSString *tagName = @"column"; 

     if([tagName isEqualToString:@"column"]) 
     { 
      NSLog(@"Value %@",string); 
     } 

    } 
+0

Ich habe eine Zeichenfolge, keine URL: NSString * urlString = [NSString stringWithFormat: @ "http://www.somewebsite.com/RunPHPtoOutputXML.php?id=%d", ii]; // ii ist eine ganze Zahl Ich führe dann folgendes aus und erhalte das XML: NSURLRequest * urlRequest = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]]; NSData * data = [NSURLConnection sendSynchronousRequest: urlRequest returningResponse: & Antwort Fehler: & Fehler]; – user3741598

+0

@ user3741598 Genau was willst du fragen? –

+0

Ich habe abgeschnitten - zu viele Zeichen - wird eine neue Frage öffnen. Obwohl ich gerade eine mögliche schnelle, schmutzige mögliche Antwort bei der Arbeit gefunden habe, werde ich versuchen, wenn ich nach Hause komme. Danke für die Frage. – user3741598

2

Dies ist, wie Sie NSXMLParser verwenden können:

In Ihrer .h-Datei declare:

NSMutableData  *webPortFolio; 
NSMutableString  *soapResultsPortFolio; 
NSURLConnection  *conn; 

//---xml parsing--- 

NSXMLParser   *xmlParserPortFolio; 
BOOL    elementFoundPortFolio; 
NSMutableURLRequest *req; 

NSString   *theXMLPortFolio; 
NSString   *strSoapMsg; 
UIAlertView   *alertView; 

In .m-Datei den folgenden Code verwenden:

-(void)callURL 
{ 

    //Your logic to call URL. 

    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
    if (conn) 
    { 
     webPortFolio = [[NSMutableData data] retain]; 
    } 
} 
And to handle the response you can use following functions : 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [webPortFolio setLength:0];  
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [webPortFolio appendData:data]; 
} 

-(void) connection:(NSURLConnection *) connection didFailWithError:(NSError *) error 
{ 

    NSLog(@"error...................%@",[error description]); 
    [webPortFolio release]; 
    [connection release]; 
} 

-(void) connectionDidFinishLoading:(NSURLConnection *) connection 
{ 

    //Check the request and returns the response. 

    NSLog(@"DONE. Received Bytes: %d", [webPortFolio length]); 

    theXMLPortFolio = [[NSString alloc] 
         initWithBytes: [webPortFolio mutableBytes] 
         length:[webPortFolio length] 
         encoding:NSUTF8StringEncoding]; 

    //---shows the XML--- 

    NSLog(@"shows the XML %@",theXMLPortFolio); 
    [theXMLPortFolio release];  

    if(xmlParserPortFolio) 
    { 
     [xmlParserPortFolio release]; 
    } 
    xmlParserPortFolio = [[NSXMLParser alloc] initWithData: webPortFolio]; 
    [xmlParserPortFolio setDelegate: self]; 
    [xmlParserPortFolio setShouldResolveExternalEntities:YES]; 
    [xmlParserPortFolio parse]; 
    [webPortFolio release]; 
    [connection release]; 
} 

//---when the start of an element is found--- 
-(void) parser:(NSXMLParser *) parser 
didStartElement:(NSString *) elementName 
    namespaceURI:(NSString *) namespaceURI 
    qualifiedName:(NSString *) qName 
    attributes:(NSDictionary *) attributeDict 
{ 

    if([elementName isEqualToString:@"your_tag_name"]) 
    { 
     if (!soapResultsPortFolio) 
     { 
      soapResultsPortFolio = [[NSMutableString alloc] init]; 
     } 
     elementFoundPortFolio = TRUE; 
     NSLog(@"Registration...%@",soapResultsPortFolio); 
    } 
    else if([elementName isEqualToString:@"your_tag_name"]) 
    { 
     elementFoundPortFolio = TRUE; 
    } 
    else if([elementName isEqualToString:@"your_tag_name"]) 
    { 
     elementFoundPortFolio = TRUE; 
    } 
    else if([elementName isEqualToString:@"your_tag_name"]) 
    { 
     elementFoundPortFolio = TRUE; 
    } 

} 

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFoundPortFolio) 
    { 
     [soapResultsPortFolio appendString: string]; 
    }  
} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 
{ 
    NSLog(@"Parser error %@ ",[parseError description]); 
} 


//---when the end of element is found--- 
-(void)parser:(NSXMLParser *)parser 
didEndElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qName 
{ 
    if ([elementName isEqualToString:@"your_tag_name"]) 
    {   
     NSLog(@"display the soap results%@",soapResultsPortFolio); 
    } 
    else if([elementName isEqualToString:@"your_tag_name"]) 
    {   
     //Perform required action 
    } 
    else if([elementName isEqualToString:@"your_tag_name"]) 
    { 
     //Perform required action 
    } 
    else if([elementName isEqualToString:@"your_tag_name"]) 
    { 
     //Perform required action 
    } 

    [soapResultsPortFolio setString:@""]; 
    elementFoundPortFolio = FALSE; 
} 
2

Ok Sie gefragt für ein libxml Beispiel. Ich benutzte es in einem Projekt, aber mit TBXML anstelle von NSXMLParser, weil dieses wichtige Probleme der Kodierung und des Datenabrufs verursachte.

Zuerst müssen Sie die Dateien TBXML.m und TBXML.h aus dem Internet herunterladen und in Ihr Projekt importieren. Dann müssen Sie auch libxml2.dylib mit Ihrem Projekt verbinden in Link Binary mit Bibliotheken.

Sobald dies geschehen, werden Sie dies tun, um Ihre Daten abzurufen (basierend auf dem XML-Quelle):

NSData *xmlData = [NSData dataWithContentsOfURL:yourURL]; 
TBXML *tbxml = [TBXML newTBXMLWithXMLData:data error:nil]; 
[self getData:tbxml.rootXMLElement]; 

- (void) getData : (TBXMLElement *) element 
{ 
    do { 
     if([[TBXML elementName:element] isEqualToString:@"table"]) 
     { 
      if([[TBXML elementName:element] isEqualToString:@"column"]) 
      { 
       if([[TBXML attributeName:element] isEqualToString:@"nameradio"]) 
       { 
        // You decide what to do here 
       } 
      } 
     } 
     if (element->firstChild) [self getData:element->firstChild]; 
    } while(element = element->nextSibling); 
} 

Sie werden wahrscheinlich diesen Code ändern, aber hier haben Sie alle grundlegenden Dinge, die Sie brauchen.

+0

Versuchen thanks.that von so schön und klar Code ist you.could Sie mir den Link von TBXML.h und TBXML.m geben. weil ich einen heruntergeladen habe, aber es zeigt mir einen fehler. – Emon

+0

Mit Vergnügen;) [Hier] (https://github.com/71squared/TBXML/blob/master/TBXML-Headers/TBXML.h) finden Sie die Header-Datei und [hier] (https: // github .com/71squared/TBXML/Blob/Master/TBXML-Code/TBXML.m) die Codedatei. Dies ist Version 1.5, die ich benutzt habe und gut für mich gearbeitet hat. – Rob

+0

Sorry zu sagen, aber hier ist ein anderes Problem ist, wenn ([[TBXML attributeName: element] isEqualToString: @ "namernadio"]) 'showing Waring etwas wie das' inkompatible Zeiger Typ TBXMLElement * ' – Emon

Verwandte Themen