Программисту часто бывает нужно работать с XML-документами. Самой популярной библиотекой для этого является libxml2. Научимся ее подключать к своему проекту.
1. Что такое libxml2?
libxml2 — это библиотека для парсинга XML-документов. Это означает,что программист может искать и править отдельные атрибуты и значения в XML-документе.
Библиотека написана на языке Си, и, вследствие этого, переносима практически на все платформы (Unix, Windows, CygWin, Mac OS, RISC OS, OS/2, VMS, QNX, MVS и т.д.).
Кроме того, существуют привязки к языкам C++, Python, PHP5 и т.д.
Библиотека распространяется под MIT-лицензией, что делает эту библиотеку весьма популярной.
Официальный сайт: xmlsoft.org
2. Загрузка библиотеки
Библиотеку libxml2 в формате готовых файлов можно загрузить на сайте: www.zlatkovic.com/projects/libxml/index.html
Нужно учесть, что файлы имеют зависимости, поэтому для выбора загружаемых файлов нужно их учитывать:
Мы видим, что в минимальном варианте нужно загрузить следующие пакеты:
- libxml
- iconv
- zlib
Заходим на www.zlatkovic.com/pub/libxml/ и загружаем три архива:
- libxml2-2.7.8.win32.zip
- iconv-1.9.2.win32.zip
- zlib-1.2.5.win32.zip
Распаковываем эти архивы в папку с CodeBlocks. В каждом архиве содержатся папки bin (исполняемые модули), lib (статические библиотеки) и include (заголовочные файлы).
Цифры в названиях можно убрать для удобства:
3. Создание проекта
Сначала создаем обычный консольный проект как здесь. Назовем проект x1. Затем вместо примера вставим следующий код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
void parseStory(xmlDocPtr doc, xmlNodePtr cur)
{
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword")))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("keyword: %s\n", key);
free(key);
}
cur = cur->next;
}
return;
}
static void parseDoc(char *docname)
{
xmlDocPtr doc;
xmlNodePtr cur;
doc = xmlParseFile(docname);
if (doc == NULL )
{
fprintf(stderr,"Document not parsed successfully. \n");
return;
}
cur = xmlDocGetRootElement(doc);
if (cur == NULL)
{
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
return;
}
if (xmlStrcmp(cur->name, (const xmlChar *) "story"))
{
fprintf(stderr,"document of the wrong type, root node != story");
xmlFreeDoc(doc);
return;
}
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo")))
{
parseStory (doc, cur);
}
cur = cur->next;
}
xmlFreeDoc(doc);
return;
}
int main(int argc, char **argv)
{
char *docname;
if (argc <= 1)
{
printf("Usage: %s docname\n", argv[0]);
return(0);
}
docname = argv[1];
parseDoc(docname);
return (1);
}
В этом примере мы парсим XML-документ и ищем ключ с именем «keyword». Затем выводим значение этого ключа.
4. Настройка компилятора
Чтобы пример заработал нужно сделать следующие три шага:
- Указать компилятору, где взять заголовочные файлы.
- Подключить библиотеки для компоновки.
- Поместить библиотеки в готовый проект.
Начнем с заголовочных файлов. Зайдите в меню «Проект — Параметры сборки — Каталоги» и добавьте пути к заголовочным файлам:
..\..\Prog\CodeBlocks2\LibXML\include
..\..\Prog\CodeBlocks2\Iconv\include
Затем переключитесь на вкладку «Настройки компоновщика» и укажите библиотеку:
..\..\Prog\CodeBlocks2\LibXML\lib\libxml2.lib
И, наконец, скопируйте следующие файлы dll в папку с программой:
- c:\Prog\CodeBlocks2\LibXML\bin\libxml2.dll
- c:\Prog\CodeBlocks2\Iconv\bin\iconv.dll
- c:\Prog\CodeBlocks2\Zlib\bin\zlib1.dll
Эти файлы нужно скопировать в папку:
c:\Work\x1\bin\Debug\
5. Создание тестового файла
Нам нужен XML-документ для работы. Создайте текстовый файл и скопируйте туда текст:
123456789101112<?xml version="1.0"?><story> <storyinfo> <author>John Fleck</author> <datewritten>June 2, 2002</datewritten> <keyword>example keyword</keyword> </storyinfo> <body> <headline>This is the headline</headline> <para>This is the body text.</para> </body></story>
Сохраните этот файл под именем a.xml в папку c:\Work\x1\bin\Debug\
Кроме того настройте рабочий каталог на эту папку. Для этого зайдите в меню «Проект — Свйоства — Цели» и напишите «bin\Debug».
6. Проверка работы
Запустите проект на компиляцию клавишей F9. Программа выведет следующее сообщение:
Это означает, что ей нужно передать файл для работы. Войдите в меню «Проект — Параметры программы» и напишите a.xml
Все готово. Запустите опять F9 и вы получите результат:
Программа нашла в XML-файле ключ «keyword» и выдала его значение: «example keyword».
Другие примеры использования библиотеки вы может посмотреть на официальном сайте: xmlsoft.org/examples/index.html Только учтите, что для использования русского текста нужно переключиться на кодировку UTF-8