Парсер 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.