Как libxml2 можно использовать для анализа данных из XML?

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

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

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

4 ответов


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


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

учебник с интерфейсом SAX

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


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

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

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

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

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

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

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

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

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


здесь я упомянул полный процесс извлечения данных 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 deirectory

  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 Promt

  7. перейти к D:\demo каталог

  8. выполнить cl libxml_test.cpp / I".\библиотеки libxml2-2.7.8.win32\include" /Я."\с iconv-1.9.2.win32\include " / link libxml2-2.7.8.\Win32 с Либ\библиотеке libxml2.Либ!--6--> команда

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