2010-06-11 3 views
9

S'il vous plaît, quelqu'un peut-il me montrer un exemple simple d'analyse de code HTML en utilisant libxml.Exemple d'analyse HTML simple, utilisant Objective-c, Xcode, et HTMLparser.h

#import <libxml2/libxml/HTMLparser.h> 

NSString *html = @"<ul>" 
    "<li><input type=\"image\" name=\"input1\" value=\"string1value\" /></li>" 
    "<li><input type=\"image\" name=\"input2\" value=\"string2value\" /></li>" 
    "</ul>" 
    "<span class=\"spantext\"><b>Hello World 1</b></span>" 
    "<span class=\"spantext\"><b>Hello World 2</b></span>"; 

1) Dites que je veux analyser la valeur de l'entrée dont le nom = input2.

Devrait afficher "string2value".

2) Dites que je veux analyser le contenu interne de chaque balise span dont class = spantext.

Devrait afficher: "Hello World 1" et "Hello World 2".

+0

libxml est pour l'analyse XML et pour cela vous devez voir TouchXML. –

+0

Même si j'utilise HTMLparser.h? Je vais jeter un oeil à TouchXML merci. – StuR

+2

@Ayaz: libxml2 prend en charge l'analyse HTML4. De la documentation clairsemée de TouchXML, il semble que ce n'est pas le cas, ce n'est donc pas approprié dans ce cas. – JeremyP

Répondre

19

J'ai utilisé Ben Reeves HTML Parser pour obtenir ce que je voulais:

NSError *error = nil; 
NSString *html = 
    @"<ul>" 
     "<li><input type='image' name='input1' value='string1value' /></li>" 
     "<li><input type='image' name='input2' value='string2value' /></li>" 
    "</ul>" 
    "<span class='spantext'><b>Hello World 1</b></span>" 
    "<span class='spantext'><b>Hello World 2</b></span>"; 
HTMLParser *parser = [[HTMLParser alloc] initWithString:html error:&error]; 

if (error) { 
    NSLog(@"Error: %@", error); 
    return; 
} 

HTMLNode *bodyNode = [parser body]; 

NSArray *inputNodes = [bodyNode findChildTags:@"input"]; 

for (HTMLNode *inputNode in inputNodes) { 
    if ([[inputNode getAttributeNamed:@"name"] isEqualToString:@"input2"]) { 
     NSLog(@"%@", [inputNode getAttributeNamed:@"value"]); //Answer to first question 
    } 
} 

NSArray *spanNodes = [bodyNode findChildTags:@"span"]; 

for (HTMLNode *spanNode in spanNodes) { 
    if ([[spanNode getAttributeNamed:@"class"] isEqualToString:@"spantext"]) { 
     NSLog(@"%@", [spanNode allContents]); //Answer to second question 
    } 
} 

[parser release]; 
+0

Je sais que c'est vieux, mais je suis assez sûr qu'il veut "allContents" et non "rawContents" – clarky

+0

@clarky Mis à jour, merci. – StuR

+0

@StuR sa bibliothèque fonctionne-t-elle également pour le développement de l'iPhone io6? – Dejell

1

Comme Vladimir dit, pour le second point il est important de remplacer rawContents avec le contenu. rawContents va imprimer le nœud de texte brut complet, à savoir:

<span class='spantext'><b>Hello World 1</b></span>