Парсер XML (Libxml2)
Компиляция libxml2 с поддержкой iconv.
с iconv потому, что без него xml файлы с кодировкой windows-1251 libxml2 не парсятся
- Качаем исходники ftp://xmlsoft.org/libxml2/libxml2-sources-2.6.23.tar.gz
- Качаем iconv http://www.zlatkovic.com/pub/libxml...1.9.1.win32.zip
Распаковываем из 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.
Оставить комментарий
Комментарии


