Table of Contents
Установка и использование libxml2
Установка libxml2
Вариант 1
Используя стандартный репозитарий.
В Fedora:
#sudo yum install libxml2
Вариант 2
Из исходников:
# wget ftp://xmlsoft.org/libxml2/libxml2-2.6.30.tar.gz # tar -zxvf libxml2-2.6.30.tar.gz # cd libxml2-2.6.30/ # ./configure && make && make install # cd /usr/include # ln -s libxml2/libxml libxml
Основные функции
Прототипы основных функций, которые необходимы для обхода XML, содержатся в заголовочных файлах parser.h и tree.h.
Для проверки версии XML используется LIBXML_TEST_VERSION
Для сопоставления файла с XML используется функция xmlReadFile (первый параметр функции - имя файла для разбора, два другие не знаю), получается так:
xmlDocPtr doc = xmlReadFile(argv[1], NULL, 0);
Переход между элементами
Дальше следует получить корень документа -
xmlNodePtr root = xmlDocGetRootElement(doc);
Переход к следующему узлу (если узел не сожержит дочерних):
xmlNodePtr cur_node = root; cur_node = cur_node->next;
Переход к дочернему узлу:
cur_node = cur_node->children;
Переход к отцу:
cur_node = cur_node->parent
Получение данных тега
У тега есть имя, атрибуты и содержание (информация). Чтобы получить их используются следующие конструкции 1) :
Получение имени тега:
printf( "%s", cur_node->name);
Работа с атрибутами (получение названий и значений и переход между атрибутами)
xmlAttrPtr attr = cur_node->properties; // берем атрибут
while(attr)
{
printf(" %s", attr->children->name); печать имени атрибута
printf(" %s", attr->children->content); печать значения атрибута
attr = attr->next;//на следующий атрибут
}
Получение содержания тега:
printf(" %s",xmlNodeGetContent(cur_node));
Пример использования
Программа сделает обход вглубину всех тегов XML-файла
#include<stdio.h>
#include<string.h>
#include<libxml/parser.h>
#include<libxml/tree.h>
xmlDocPtr doc = NULL;//указатель на документ
void rec(xmlNodePtr node)
{
xmlNodePtr cur_node = node;
while (cur_node)
{
if (cur_node->type == XML_ELEMENT_NODE) //проверяем что попали на узел
{
printf( "node: %s\n", cur_node->name);
}
rec(cur_node->children);
cur_node = cur_node->next;
}
}
int main(int argc, char **argv)
{
LIBXML_TEST_VERSION;
doc = xmlReadFile(argv[1], NULL, 0);
if(doc == NULL)
{
printf("Error parsing file %s\n", argv[1]);
exit(1);
}
xmlNodePtr root = xmlDocGetRootElement(doc);
rec(root);
xmlFreeDoc(doc);
return 0;
}
Команда компиляции:
gcc -lxml2 -o res main.c
Пример файла для разбора:
<?xml version="1.0"?>
<gjob:Helping xmlns:gjob="http://www.gnome.org/some-location">
<gjob:Jobs>
<gjob:Job>
<gjob:Project ID="3"/>
<gjob:Application>GBackup</gjob:Application>
<gjob:Category>Development</gjob:Category>
<gjob:Update>
<gjob:Status>Open</gjob:Status>
<gjob:Modified>Mon, 07 Jun 1999 20:27:45 -0400 MET DST</gjob:Modified>
<gjob:Salary>USD 0.00</gjob:Salary>
</gjob:Update>
<gjob:Developers>
<gjob:Developer>
</gjob:Developer>
</gjob:Developers>
<gjob:Contact>
<gjob:Person>Nathan Clemons</gjob:Person>
<gjob:Email>nathan@windsofstorm.net</gjob:Email>
<gjob:Company>
</gjob:Company>
<gjob:Organisation>
</gjob:Organisation>
<gjob:Webpage>
</gjob:Webpage>
<gjob:Snailmail>
</gjob:Snailmail>
<gjob:Phone>
</gjob:Phone>
</gjob:Contact>
</gjob:Job>
</gjob:Jobs>
</gjob:Helping>
Запуск и результат:
# ./res exsample.xml node: Helping node: Jobs node: Job node: Project node: Application node: Category node: Update node: Status node: Modified node: Salary node: Developers node: Developer node: Contact node: Person node: Email node: Company node: Organisation node: Webpage node: Snailmail node: Phone