Программисту часто бывает нужно работать с 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. Затем вместо примера вставим следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#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-документ для работы. Создайте текстовый файл и скопируйте туда текст:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?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.