Получение атрибутов html из деревьев DOM (libxml) - PullRequest
0 голосов
/ 30 апреля 2009

Я использую эту программу для отображения списка всех HTML-тегов в данном файле:

#include <cstdio>
#include <libxml/HTMLparser.h>
#include <libxml/tree.h>
#include <iostream>
#include <cstring>

using namespace std;

static void
print_element_names(htmlNodePtr a_node)
{
    htmlNodePtr cur_node = NULL;

    for (cur_node = a_node; cur_node!=NULL; cur_node = cur_node->next) {
            printf("node type: Element, name: %s\n", cur_node->name);
        print_element_names(cur_node->children);
    }
}

int main(int argc, char **argv) {

  htmlDocPtr doc;
  htmlNodePtr root_node;

  doc = htmlReadFile(argv[1], NULL, 0);
  root_node = xmlDocGetRootElement(doc);

  print_element_names(root_node);

    xmlFreeDoc(doc);

    xmlCleanupParser();

    return 0;

}

Как заставить его отображать атрибуты (например, href="something" для <a>)?

1 Ответ

0 голосов
/ 30 апреля 2009

Вроде нет такого поля:

zajec@linux-lbnn:~/Prog_zesp> g++ `xml2-config --cflags --libs` -o tester tester.cpp
tester.cpp: In function ‘void print_element_names(xmlNode*)’:
tester.cpp:17: error: ‘struct _xmlNode’ has no member named ‘attributes’

=== РЕДАКТИРОВАТЬ ===

Если я сделаю что-то вроде этого:

if (strcmp((char *)cur_node->name, "a")==0) {
        cout << cur_node->properties->name << endl;

Я получаю название атрибута - "href"

Если я сделаю еще один шаг:

if (strcmp((char *)cur_node->name, "a")==0) {
            cout << cur_node->properties->children->name << endl;

Я получаю "текст", но не фактическую ссылку.

...