Как можно использовать libxml2 для анализа данных из XML? - PullRequest
10 голосов
/ 29 марта 2011

Я посмотрел на примеры кода libxml2 и запутался, как собрать их все вместе.

Какие шаги необходимы при использовании libxml2 для простого анализа или извлечения данных из файла XML?

Я бы хотел получить и, возможно, сохранить информацию об определенных атрибутах. Как это сделать?

Ответы [ 4 ]

7 голосов
/ 29 марта 2011

Полагаю, вам сначала нужно создать дерево разбора.Может быть, эта статья может помочь, посмотрите раздел, в котором написано Как разобрать дерево с помощью Libxml2 .

3 голосов
/ 30 марта 2011

libxml2 предоставляет различные примеры, показывающие базовое использование.

http://xmlsoft.org/examples/index.html

Для ваших заявленных целей, вероятно, наиболее уместно будет использовать tree1.c.

tree1.c: Перемещение по дереву для печати имен элементов

Анализ файла в дереве, использование xmlDocGetRootElement () для получения корневого элемента, затем просмотр документа и печать всех имен элементов в порядке документов.

http://xmlsoft.org/examples/tree1.c

Если у вас есть структура xmlNode для элемента, элемент «properties» представляет собой связанный список атрибутов.Каждый объект xmlAttr имеет объект «name» и «children» (которые являются соответственно именем / значением для этого атрибута) и «next» член, который указывает на следующий атрибут (или ноль для последнего).

http://xmlsoft.org/html/libxml-tree.html#xmlNode

http://xmlsoft.org/html/libxml-tree.html#xmlAttr

3 голосов
/ 29 марта 2011

Я нашел эти два ресурса полезными, когда учился использовать libxml2 для создания анализатора RSS-каналов.

Учебное пособие с интерфейсом SAX

Учебное пособие по использованиюдерево DOM (пример кода для получения значения атрибута)

2 голосов
/ 08 августа 2016

Здесь я упомянул полный процесс извлечения данных XML / HTML из файла на платформе Windows.

  1. Первая загрузка предварительно скомпилирована .dll форма http://xmlsoft.org/sources/win32/
  2. Также загрузите его зависимость iconv.dll и zlib1.dll с той же страницы

  3. Извлеките все файлы .zip в один каталог. Например: D: \ demo \

  4. Копирование iconv.dll , zlib1.dll и libxml2.dll в каталог c: \ windows \ system32

  5. Создайте libxml_test.cpp файл и скопируйте в него следующий код.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <libxml/HTMLparser.h>
    
    void traverse_dom_trees(xmlNode * a_node)
    {
        xmlNode *cur_node = NULL;
    
        if(NULL == a_node)
        {
            //printf("Invalid argument a_node %p\n", a_node);
            return;
        }
    
        for (cur_node = a_node; cur_node; cur_node = cur_node->next) 
        {
            if (cur_node->type == XML_ELEMENT_NODE) 
            {
                /* Check for if current node should be exclude or not */
                printf("Node type: Text, name: %s\n", cur_node->name);
            }
            else if(cur_node->type == XML_TEXT_NODE)
            {
                /* Process here text node, It is available in cpStr :TODO: */
                printf("node type: Text, node content: %s,  content length %d\n", (char *)cur_node->content, strlen((char *)cur_node->content));
            }
            traverse_dom_trees(cur_node->children);
        }
    }
    
    int main(int argc, char **argv) 
    {
        htmlDocPtr doc;
        xmlNode *roo_element = NULL;
    
        if (argc != 2)  
        {
            printf("\nInvalid argument\n");
            return(1);
        }
    
        /* Macro to check API for match with the DLL we are using */
        LIBXML_TEST_VERSION    
    
        doc = htmlReadFile(argv[1], NULL, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
        if (doc == NULL) 
        {
            fprintf(stderr, "Document not parsed successfully.\n");
            return 0;
        }
    
        roo_element = xmlDocGetRootElement(doc);
    
        if (roo_element == NULL) 
        {
            fprintf(stderr, "empty document\n");
            xmlFreeDoc(doc);
            return 0;
        }
    
        printf("Root Node is %s\n", roo_element->name);
        traverse_dom_trees(roo_element);
    
        xmlFreeDoc(doc);       // free document
        xmlCleanupParser();    // Free globals
        return 0;
    }
    
  6. Открыть командную строку Visual Studio

  7. Перейти к D: \ demo directory

  8. выполнить cl libxml_test.cpp /I".\libxml2-2.7.8.win32\include "/I".\iconv-1.9.2.win32\include" / link libxml2-2.7. 8.win32 \ lib \ libxml2.lib команда

  9. Запуск двоичного файла с использованием libxml_test.exe test.html (здесь test.html может быть любым допустимым HTML-файлом)

...