Discussione: [C++]Gestire Firefox
View Single Post
Old 22-12-2008, 17:12   #4
PhysX
Senior Member
 
Iscritto dal: Jun 2008
Cittā: Treviso
Messaggi: 1026
Per C++ non so se ci sono librerie giā pronte che fanno la stessa cosa, io mi ero fatto un parser usando TidyLib, si usa cosi:

Codice PHP:
Parser parser(fileName);
if (!
parser.isValid()) return false;

// getText ritorna il testo contenuto nel nodo:
title parser.getText("/html/body/div/table[2]/tr/td[2]/p/a/font/b/");
author parser.getText("/html/body/div/table[2]/tr/td[2]/p/a[2]/font/b/");
description parser.getText("/html/body/div/table[2]/tr/td[2]/p/");

// getValue ritorna il valore della proprieta specificata del nodo:
// (in questo caso č l'attributo HREF)
imageUrl parser.getValue("/html/body/div/table[2]/tr/td[2]/a/"TidyAttr_HREF);
downloadUrl parser.getValue("/html/body/div/table[2]/tr/td[2]/p/a/"TidyAttr_HREF); 
qua c'č il codice della classe Parser, al posto di wxString puoi usare std::string se non usi wxWidget. per usarlo basta che includi il file parser.h nel tuo progetto e lo linki a tidylib.

Codice PHP:
#include <tidy.h>
#include <buffio.h>
#include <stdio.h>
#include <errno.h>
#include "wx/wx.h"
#include "wx/string.h"

class Parser {
    
TidyDoc tdoc;
    
bool valid;

    
bool walk(TidyNode &currentNode, const chartagint pos);
    
void analizeToken(wxString &tokenint &pos);
    
TidyNode getNode(wxString path);
public:
    
Parser();
    
Parser(const charinput);
    
bool open(const charinput);
    
wxString getValue(wxString pathTidyAttrId attr);
    
wxString getText(wxString path);
    
bool isValid() const;
    ~
Parser();
};

Parser::Parser() {
    
valid=false;
}
Parser::Parser(const charinput) {
    
open(input);
}

bool Parser::open(const charinput) {
    
TidyBuffer output = {0};
    
TidyBuffer errbuf = {0};
    
int rc = -1;
    
Bool ok;
    
valid=false;

    
assert(input);

    
tdoc tidyCreate();                     // Initialize "document"
    
ok tidyOptSetBooltdocTidyXhtmlOutyes );  // Convert to XHTML
    
if ( ok )
    
rc tidySetErrorBuffertdoc, &errbuf );      // Capture diagnostics
    
if ( rc >= )
    
rc tidyParseStringtdocinput );           // Parse the input
    
if ( rc >= )
    
rc tidyCleanAndRepairtdoc );               // Tidy it up!
    
if ( rc >= )
    
rc tidyRunDiagnosticstdoc );               // Kvetch
    
if ( rc )                                    // If error, force output.
    
rc = ( tidyOptSetBool(tdocTidyForceOutputyes) ? rc : -);
    if ( 
rc >= )
    
rc tidySaveBuffertdoc, &output );          // Pretty Print

    
if ( rc >= )
        
valid=true;
    else 
        
valid=false;
    
tidyBufFree( &output );
    
tidyBufFree( &errbuf );
    return 
valid;
}
bool Parser::isValid() const {
    return 
valid;
}
Parser::~Parser() {    
    
tidyReleasetdoc );
}
TidyNode Parser::getNode(wxString path) {
    
TidyNode currentNode=tidyGetRoot(tdoc);
    
int initTag,endTag,pos;
    
wxString token;    
    
initTag=1;
    
endTag=path.find('/',initTag);
    while (
endTag!=wxString::npos) {
        
token=path.substr(initTag,endTag-initTag);
        if (
token.IsEmpty()) continue;
        
analizeToken(tokenpos);
        if (!
walk(currentNodetoken.mb_str(),pos)) return 0;
        
initTag=endTag+1;
        
endTag=path.find('/',initTag);
        
charname=(char*)tidyNodeGetName(currentNode);
    }
    return 
currentNode;
}

wxString Parser::getValue(wxString pathTidyAttrId attr) {
    
wxString result;
    
TidyNode currentNode=getNode(path);
    if (
currentNode)
        
result=wxString((char*)tidyAttrValue(tidyAttrGetById(currentNodeattr)), wxConvUTF8);
    return 
result;
}

wxString Parser::getText(wxString path) {
    
TidyNode currentNode=getNode(path);
    
wxString result;
    if (!
currentNode) return result;
    
    for (
TidyNode child=tidyGetChild(currentNode); childchild=tidyGetNext(child)) {
        if (
tidyNodeIsText(child)) {
            
TidyBuffer buf={0};
            
tidyNodeGetText(tdocchild, &buf);
            
result+=wxString((char*)buf.bpwxConvUTF8);
        }
    }
    return 
result;
}

void Parser::analizeToken(wxString &tokenint &pos) {
    
int pqa=token.find('[');
    
int pqb=token.find(']');
    
pos=1;
    if (
pqa!=wxString::npos && pqb!=wxString::npos) {
        
wxString stringpos=token.substr(pqa+1,pqb-pqa-1);
        
pos=atoi(stringpos.mb_str());
        
token=token.substr(0,pqa);
    }
}

bool Parser::walk(TidyNode &currentNode, const chartagint pos) {
    
assert(tag);
    
assert(pos>=1);        
    
int index=0;
    
TidyNode child;
    for ( 
child tidyGetChild(currentNode); childchild tidyGetNext(child) ) {
        
charname=(char*)tidyNodeGetName(child);
        if (!
name) continue;
        if (!
strcmp(nametag)) index++;
        if (
index==pos) {
            
currentNode=child;
            return 
true;
        }
    }
    return 
false;

PhysX č offline   Rispondi citando il messaggio o parte di esso