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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

     #include  #include  #include  #include  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-файлом)