Найти в Дзене

Библиотека libxml2 для работы с XML-файлами

Оглавление

Программисту часто бывает нужно работать с 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 (заголовочные файлы).

Цифры в названиях можно убрать для удобства:

-2

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

-3

Затем переключитесь на вкладку «Настройки компоновщика» и укажите библиотеку:

..\..\Prog\CodeBlocks2\LibXML\lib\libxml2.lib

-4

И, наконец, скопируйте следующие файлы 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».

-5

6. Проверка работы

Запустите проект на компиляцию клавишей F9. Программа выведет следующее сообщение:

-6

Это означает, что ей нужно передать файл для работы. Войдите в меню «Проект — Параметры программы» и напишите a.xml

-7

Все готово. Запустите опять F9 и вы получите результат:

-8

Программа нашла в XML-файле ключ «keyword» и выдала его значение: «example keyword».

Другие примеры использования библиотеки вы может посмотреть на официальном сайте: xmlsoft.org/examples/index.html Только учтите, что для использования русского текста нужно переключиться на кодировку UTF-8