Как libxml2 можно использовать для анализа данных из XML?
Я посмотрел на образцы кода libxml2, и я смущен тем, как собрать их все вместе.
какие шаги необходимы при использовании libxml2 для простого анализа или извлечения данных из XML-файла?
Я хотел бы получить доступ и, возможно, хранить информацию для определенных атрибутов. Как это делается?
4 ответов
Я считаю, что сначала нужно создать дерево разбора. Возможно, эта статья может помочь, просмотрите раздел, в котором говорится Как разобрать дерево с помощью Libxml2.
Я нашел эти два ресурса полезными, когда учился использовать libxml2 для создания парсера rss-каналов.
учебник с использованием дерева 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 для последнего один.)
здесь я упомянул полный процесс извлечения данных XML / HTML из файла на платформе windows.
- первая загрузка предварительно скомпилирована .dll файлы форма http://xmlsoft.org/sources/win32/
также загрузите свою зависимость iconv.dll файлы и zlib1.dll файлы С той же страницы
извлечь все .zip-файлы в том же каталоге. Например: D:\demo\
копировать iconv.dll файлы, zlib1.dll файлы и библиотеки libxml2.dll файлы на c:\windows\system32 deirectory
-
сделать 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; }
Открыть Команду Visual Studio Promt
перейти к D:\demo каталог
выполнить 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--> команда
запустите двоичный файл с помощью libxml_test.тест ехе.HTML-код (здесь тест.html может быть любым допустимым HTML-файлом)