ΠΠ°ΡΡΠ΅Ρ XML (Libxml2)
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ libxml2 Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ iconv.
C 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
Π·Π°ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±Π΅Π· 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; }