2010-06-11 3 views
9

Proszę, może ktoś mi pokazać prosty przykład parsowania niektórych HTML przy użyciu libxml.Prosty przykład analizowania HTML libxml2, używając Objective-c, Xcode i 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) Powiedz, że chcę przeanalizować wartość wejścia, którego nazwa = wejście2.

Powinna być wyprowadzana "wartość ciągu2".

2) Powiedz, że chcę przeanalizować wewnętrzną zawartość każdego tagu span, którego klasę = spantext.

Powinieneś wydrukować: "Hello World 1" i "Hello World 2".

+0

libxml jest do parsowania xml i do tego trzeba zobaczyć TouchXML. –

+0

Mimo że używam HTMLparser.h? Popatrzę na TouchXML dzięki. – StuR

+2

@Ayaz: libxml2 obsługuje parsowanie HTML4. Z nielicznej dokumentacji TouchXML wynika, że ​​tak nie jest, więc nie jest to właściwe w tym przypadku. – JeremyP

Odpowiedz

19

Kiedyś Ben Reeves' HTML Parser aby osiągnąć to, co chciałem:

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

Wiem, że to jest stare, ale jestem prawie pewien, że chce "allContents", a nie "rawContents" – clarky

+0

@clarky Updated, dziękuję. – StuR

+0

@StuR robi również swoją bibliotekę dla iPhone'a rozwojowego io6? – Dejell

1

Jak Władimir powiedział do drugiego punktu ważne jest, aby zastąpić rawContents z treści. rawContents wydrukuje pełny węzeł tekstu nieprzetworzonego, tj .:

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