Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Парсер XML (Libxml2)

Автор: SABROG

Компиляция libxml2 с поддержкой iconv.

с iconv потому, что без него xml файлы с кодировкой windows-1251 libxml2 не парсятся

Распаковываем из iconv-1.9.1.win32.zip iconv.dll (скомпилена MSVC) и копируем в bin директорию с установленным билдером (N:\Program Files\Borland\CBuilder6\Bin\)

Натравливаем утилиту IMPLIB:

N:\Program Files\Borland\CBuilder6\Bin\IMPLIB -a -c iconv.lib iconv.dll

(опция -a для добавления "_" перед именем функции, -c - чувствительность к регистру)

Копируем iconv.lib в win32 директорию с иходниками libxml2 и переименовываем в iconvomf.lib.

Копируем iconv.dll и iconvomf.lib в c:\opt\lib, iconv.h в c:\opt\include

Дополняем секцию "# Libxml object files." в

Makefile.bcb строками:
	$(XML_INTDIR)\schematron.obj\
	$(XML_INTDIR_A)\schematron.obj\

Выполняем конфигурацию.

Войти в папку win32 в папке с исходниками libxml2 использую любой удобный файловый

менеджер типа FAR'a или команду CD в командной строке.

(для BCB6 ряд .h файлов являются не полными (размер 11кб вместо 22кб), поэтому libxml2 отказывается собираться, поэтому я подключил директории с инклудами и лихами от BDS2006)

Ввести следующий код в командную строку поменяв предварительно пути. (c:\opt взято из документации, но как я понял эта директория не используется iconv - по умолчанию стоит уже в yes, поэтому эту опцию можно опустить.)

cscript configure.js compiler=bcb prefix=c:\opt
        include=N:\Progra~1\Borland\BDS\4.0\Include
        lib=N:\Progra~1\Borland\BDS\4.0\Lib
        debug=yes dynruntime=yes iconv=yes

затем компилируем исходники командой:

make

После полной остановки без Erroroв копируем хидеры из исходников (.h) libxml2 в /include/libxml и лифы (.lib) в /include/lib/libxml директорию где установлен BCB.

При написании приложения добавить в проект:

#include "libxml/parser.h"
#include "libxml/debugXML.h"

Если xml файл в кодировке windows-1251, то полученные данные в русских кодировках будут возвращаться в формате Utf8. Поэтому при чтении/записи в/из xml нужно каждый раз использовать функции Utf8ToAnsi и AnsiToUtf8 (это не функции iconv или libxml2).

Бросаем в папку с проектом 2 dllки, iconv.dll и libxml2.dll

Проект конечно получается жирным, но ради чего только не пойдешь, чтобы написать реально нужное приложение.

Небольшой пример как работать с библиотекой:

#include <vcl.h>
#pragma hdrstop

#include "XML_Main.h"
#include "libxml/parser.h"
#include "libxml/debugXML.h"
xmlDocPtr MyFileXml;
xmlXPathContext *ctx;
xmlXPathObject *Obj;
xmlXPathContextPtr Ctx;
TStringList *Result;

AnsiString FileName = "MyFile.xml";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Result = new TStringList;
       if (FileExists(FileName)){
        MyFileXml = xmlParseFile(FileName.c_str());
                if (MyFileXml != NULL)
                {
                Ctx = xmlXPathNewContext(MyFileXml);
                        if (Ctx != NULL)
                        {
//XPath выражения, подробней читать тут: www.w3.org/TR/xpath
//примеры тут: http://www.w3schools.com/xpath/xpath_examples.asp
			XPath("/reference/item[id=510]/name",Result); 
			ShowMessage(Result->Strings[0]); // Результат поисков
                        }
                }
xmlFree MyFileXml;
xmlFree Ctx;
xmlFree Obj;
delete Result;
}

//не забудь прописать прототип функции в заголовочном файле.
__int32 __fastcall TForm1::XPath(AnsiString Eval,TStringList *Result)
{
Result->Clear();
Obj = xmlXPathEvalExpression((xmlChar *)AnsiToUtf8(Eval).c_str(),Ctxs[index]);
               if (Obj != NULL)
               {
       for (int i=0; i < Obj->nodesetval->nodeNr; i++) {
       xmlChar *key = xmlNodeGetContent(Obj->nodesetval->nodeTab[i]);
       Result->Add(Utf8ToAnsi(PChar(key)));
       xmlFree(key);
       }
               }
               else
               {
       ShowMessage("Данные не найдены");
               }
return Result->Count;
}

P.S.: написано за 15 минут после удачной компиляции libxml2 2.6.23, в час ночи.

На ошибки внимания не обращать, на полноту изложения не претендую. Написано после тщетных попыток найти нормальный xml парсер в течении 3х месяцев под BCB.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
30 апреля 2006, 15:09:19
блин, спасибо....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог