Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 122

Автор Π”. БтСфСнс

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.4. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» xerces_strings.hpp, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для выполнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ строками Xerces ΠΈ строками со стандартными символами

#ifndef XERCES_STRINGS_HPP_INCLUDED

#define XERCES_STRINGS_HPP_INCLUDED


#include <string>

#include <boost/scoped_array.hpp>

#include <xercesc/util/XMLString.hpp>


typedef std::basic_string<XMLCh> XercesString;


// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку со стандартными символами

// Π² строку с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов

inline XercesString fromNative(const char* str) {

boost::scoped_array<XMLCh> ptr(xercesc::XMLString::transcode(str));

 return XercesString(ptr.get());

}


// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку со стандартными символами

// Π² строку с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов.

inline XercesString fromNative(const std::string& str) {

 return fromNative(str.c_str());

}


// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов

// Π² строку со стандартными символами.

inline std::string toNative(const XMLCh* str) {

boost::scoped_array<char> ptr(xercesc::XMLString::transcode(str));

 return std::string(ptr.get());

}


// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов Π² строку со стандартными символами.

inline std::string toNative(const XercesString& str) {

 return toNative(str.c_str());

}


#endif // #ifndef XERCES_STRINGS_HPP_INCLUDED

Для выполнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ строками Xerces ΠΈ std::wstring просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ конструктор std::basic_string, пСрСдавая Π΅ΠΌΡƒ Π΄Π²Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку Xerces Π² строку std::wstring

std::wstring xercesToWstring(const XercesString& str) {

 return std::wstring(str.begin(), str.end());

}


// ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку std::wstring Π² строку XercesString

XercesString wstringToXerces(const std::wstring& str) {

 return XercesString(str.begin(), str.end());

}

Π’ этих функциях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ wchar_t ΠΈ XMLCh ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ нСявно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ; это Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСзависимо ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° wchar_t, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ значСния, выходящиС Π·Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ XMLCh. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² строки Π² C-стилС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ конструктор std::basic::string, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² массив символов ΠΈ Π΄Π»ΠΈΠ½Π°.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Для прСдставлСния строк Π² ΠΊΠΎΠ΄Π΅ Unicode Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Xerces ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов XMLCh, Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌΡ‹Π΅ Π½ΡƒΠ»Π΅ΠΌ. Π’ΠΈΠΏ XMLCh вводится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ typedef ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, зависящий ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ содСрТащий Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 16 Π±ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… достаточно для прСдставлСния символов ΠΏΠΎΡ‡Ρ‚ΠΈ любого языка. Xerces примСняСт ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ UTF-16, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прСдставлСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… символов Π² ΠΊΠΎΠ΄Π΅ Unicode Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… символов XMLCh; ΠΎΠ΄Π½Π°ΠΊΠΎ практичСски ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ XMLCh нСпосрСдствСнно прСдставляСт ΠΎΠ΄ΠΈΠ½ символ Π² ΠΊΠΎΠ΄Π΅ Unicode, Ρ‚.Π΅. ΠΈΠΌΠ΅Π΅Ρ‚ числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ символа Unicode.

Одно врСмя Ρ‚ΠΈΠΏ XMLCh опрСдСлялся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ typedef ΠΊΠ°ΠΊ wchar_t, Ρ‡Ρ‚ΠΎ позволяло Π»Π΅Π³ΠΊΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ копию строки Xerces ΠΊΠ°ΠΊ std::wstring. Однако Π² настоящСС врСмя Xerces опрСдСляСт XMLCh Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ typedef ΠΊΠ°ΠΊ unsigned short. ΠšΡ€ΠΎΠΌΠ΅ всСго ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… Ρ‚ΠΈΠΏΡ‹ XMLCh ΠΈ wchar_t ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Xerces ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ XMLCh, нСльзя Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ XMLCh Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли трСбуСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ копию строки Xerces, слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ std::basic_string<XMLCh>.

ΠŸΡ€ΠΈ использовании Xerces Π²Π°ΠΌ придСтся часто Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ строками со стандартными символами ΠΈ строками Xerces; для этой Ρ†Π΅Π»ΠΈ Π² Xerces прСдусмотрСна пСрСгруТСнная функция transcode(). transcode() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строку Unicode Π² строку со стандартными символами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ Β«Ρ€ΠΎΠ΄Π½ΡƒΡŽΒ» ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ символов, ΠΈΠ»ΠΈ строку с Β«Ρ€ΠΎΠ΄Π½ΠΎΠΉΒ» ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ со стандартными символами Π² строку Unicode. Однако смысл Ρ€ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, поэтому Ссли Π²Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π² срСдС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСсколько ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ символов, Ρ‚ΠΎ Π²Π°ΠΌ придСтся всС Π²Π·ΡΡ‚ΡŒ Π² свои Ρ€ΡƒΠΊΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прСобразования особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΠΈΠ±ΠΎ фасСт std::codecvt, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ слуТбы ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ (pluggable transcoding services) Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Xerces, описанныС Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Xerces. Однако Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π²ΠΏΠΎΠ»Π½Π΅ достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ transcode().

ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ transcode() строки, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½ΡƒΠ»Π΅ΠΌ, динамичСски выдСляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new Π² Ρ„ΠΎΡ€ΠΌΠ΅ массива; Π²Π°ΠΌ придСтся строку ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ самому, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete[]. Π­Ρ‚ΠΎ создаСт Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ управлСния памяти, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ трСбуСтся ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎ Π΅Π΅ удалСния, Π° эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π― Ρ€Π΅ΡˆΠ°ΡŽ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.4 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ шаблона boost::scoped_array, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ динамичСски выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ массив ΠΈ автоматичСски удаляСт Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· области видимости, Π΄Π°ΠΆΠ΅ Ссли выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. НапримСр, рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fromNative.

inline XercesString fromNative(const char* str) {

 boost::scoped_array<XMLCh> ptr(xercesc::XMLString::transcode(str));

 return XercesString(ptr.get());

}

Π—Π΄Π΅ΡΡŒ ptr становится ΠΎΠ±Π»Π°Π΄Π°Ρ‚Π΅Π»Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ transcode() строки с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ символом ΠΈ освобоТдаСт Π΅Π΅, Π΄Π°ΠΆΠ΅ Ссли конструктор XercesString выбрасываСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ std::bad_alloc.

14.3. БинтаксичСский Π°Π½Π°Π»ΠΈΠ· слоТного Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ XML, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ DTD ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ пространства ΠΈΠΌΠ΅Π½ XML. ВрСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ содСрТащиСся Π² Π½Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½Π°Π±ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² C++.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Xerces Π² Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса SAX2 (простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс для XML, вСрсия 2.0). Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, создайтС класс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ xercesc::ContentHandler; этот класс Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ увСдомлСния с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ структурС ΠΈ содСрТимом вашСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Π΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ xercesc::ErrorHandler, для получСния ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. БконструируйтС парсСр Ρ‚ΠΈΠΏΠ° xercesc::SAX2XMLReader, зарСгистрируйтС экзСмпляры классов вашСго ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ парсСра setContentHandler() ΠΈ setErrorHandler(). НаконСц, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ парсСра parse(), пСрСдавая Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится ваш Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.

НапримСр, ΠΏΡƒΡΡ‚ΡŒ трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML animals.xml, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.1, ΠΈ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ std::vector ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Animal, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…, пСрСчислСнных Π² этом Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅. (ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса Animal даСтся Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.2.) Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.3 я ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ TinyXml. Для услоТнСния Π·Π°Π΄Π°Ρ‡ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ пространства ΠΈΠΌΠ΅Π½, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.5.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.5. Бписок Ρ†ΠΈΡ€ΠΊΠΎΠ²Ρ‹Ρ… ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ пространства ΠΈΠΌΠ΅Π½ XML

<?xml version="1.0" encoding="UTF-8"?>

<!- Π–ΠΈΠ²ΠΎΡ‚Π½Ρ‹Π΅ Ρ†ΠΈΡ€ΠΊΠ° Feldman Family Circus с использованиСм пространств ΠΈΠΌΠ΅Π½ -->

<ffc:animalList xmlns:ffc="http://www.feldman-family-circus.com">

 <ffc:animal>

  <ffc:name>Herby</ffc:name>

  <ffc:species>elephant</ffc:species>

  <ffc:dateOfBirth>1992-04-23</ffc:dateOfBirth>

  <ffc:veterinarian name="Dr. Hal Brown" phone="(801)595-9627"/>

  <ffc:trainer name="Bob Fisk" phone="(801)881-2260"/>

 </ffc:animal>

 <!- ΠΈ Ρ‚.Π΄. -->

</ffc:animalList>

Для Π°Π½Π°Π»ΠΈΠ·Π° этого Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SAX2 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ContentHandler, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.6, ΠΈ ErrorHandler, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.7. Π—Π°Ρ‚Π΅ΠΌ сконструируйтС SAX2XMLReader, зарСгистрируйтС ваши ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ запуститС парсСр. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.8.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.6. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ SAX2 ContentHandler для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° animals.xml

#include <stdexcept> // runtime_error

#include <vector>

#include <xercesc/sax2/Attributes.hpp>

#include <xercesc/sax2/DefaultHandler.hpp> // Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π΅Π·

                                           // ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ…

                                           // ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ…

#include "xerces_strings.hpp"              // Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.4

#include "animal.hpp"


using namespace std;

using namespace xercesc;


// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр Contact, построСнный

// Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

Contact contactFromAttributes(const Attributes &attrs) {