Библиотека 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 (заголовочные файлы).

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

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. Настройка компилятора

Чтобы пример заработал нужно сделать следующие три шага:

  1. Указать компилятору, где взять заголовочные файлы.
  2. Подключить библиотеки для компоновки.
  3. Поместить библиотеки в готовый проект.

Начнем с заголовочных файлов. Зайдите в меню «Проект — Параметры сборки — Каталоги» и добавьте пути к заголовочным файлам:

..\..\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-документ для работы. Создайте текстовый файл и скопируйте туда текст:

<?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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

➤