// Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ²
Contact contactFromAttributes(const Attributes &attrs) {
// ΠΠ»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΡΡΠΎΠΊΠΈ
// Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
static XercesString name = fromNative("name");
static XercesString phone = fromNative("phone");
Contact result; // ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Contact.
const XMLCh* val; // ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° name ΠΈΠ»ΠΈ phone.
// Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Contact.
if ((val = attrs.getValue(name.c_str())) != 0) {
result.setName(toNative(val));
} else {
throw runtime_error("contact missing name attribute");
}
// Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Contact.
if ((val = attrs.getValue(phone.c_str())) != 0) {
result.setPhone(toNative(val));
} else {
throw runtime_error("contact missing phone attribute");
}
return result;
}
// Π Π΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ
// ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ Π½Π°ΡΠ°Π»Π΅ ΠΈ ΠΊΠΎΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
class CircusContentHandler : public DefaultHandler {
public:
CircusContentHandler(vector<Animal>& animalList) :
animalList_(animalList) {}
// ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π΅ΡΠ΅ΡΠΈΠ½Π°ΡΠ° ΠΈΠ»ΠΈ Π΄ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ°
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ attrs Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Contact Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ
// Animal; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΡΡΠΈΡΠ΅ currentText_, ΠΏΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Ρ
// ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² characters()
void startElement(
const XMLCh *const uri, // URI ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½
const XMLCh *const localname, // ΠΈΠΌΡ ΡΠ΅Π³Π° Π±Π΅Π· ΠΏΡΠ΅ΡΠΈΠΊΡΠ° NS
const XMLCh *const qname, // ΠΈΠΌΡ ΡΠ΅Π³Π° + ΠΏΡΠ΅ΡΠΈΠΊΡ NS
const Attributes &attrs) // Π°ΡΡΠΈΠ±ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
{
static XercesString animalList = fromNative("animalList");
static XercesString animal = fromNative("animal");
static XercesString vet = fromNative("veterinarian");
static XercesString trainer = fromNative("trainer");
static XercesString xmlns =
fromNative("http://www.feldman-family-circus.com");
// ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ URI ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½
if (uri != xmlns)
throw runtime_error(
string("wrong namespace uri ") + toNative(uri)
);
if (localname == animal) {
// ΠΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ Animal; ΡΡΠΎ Π±ΡΠ΄Π΅Ρ
// "ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Animal"
animalList_.push_back(Animal());
} else if (localname != animalList) {
Animal& animal = animalList_.back();
if (localname == vet) {
// ΠΡ Π²ΡΡΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ "Π²Π΅ΡΠ΅ΡΠΈΠ½Π°Ρ".
animal.setVeterinarian(contactFromAttributes(attrs));
} else if (localname == trainer) {
// ΠΡ Π²ΡΡΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ "Π΄ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊ".
animal.setTrainer(contactFromAttributes(attrs));
} else {
// ΠΡ Π²ΡΡΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ "ΠΊΠ»ΠΈΡΠΊΠ°", "Π²ΠΈΠ΄ ΠΆΠΈΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ" ΠΈΠ»ΠΈ
// "Π΄Π°ΡΠ° ΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ". ΠΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ
// ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ characters().
currentText_.clear();
}
}
}
// ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»ΠΈΡΠΊΡ, Π²ΠΈΠ΄ ΠΆΠΈΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π΄Π°ΡΡ
// ΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Ρ ΡΠ°Π½ΠΈΠΌΡΠΉ Π² currentText_ ΡΠ΅ΠΊΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
// ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Animal.
void endElement(
const XMLCh *const uri, // URI ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½
const XMLCh *const localname, // ΠΈΠΌΡ ΡΠ΅Π³Π° Π±Π΅Π· ΠΏΡΠ΅ΡΠΈΠΊΡΠ° NS
const XMLCh *const qname) // ΠΈΠΌΡ ΡΠ΅Π³Π° + ΠΏΡΠ΅ΡΠΈΠΊΡ NS
{
static XercesString animalList = fromNative("animal-list");
static XercesString animal = fromNative("animal");
static XercesString name = fromNative("name");
static XercesString species = fromNative("species");
static XercesString dob = fromNative("dateOfBirth");
if (localname!= animal && localname!= animalList) {
// currentText_ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅ΠΊΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ»
// Π΄ΠΎΠ±Π°Π²Π»Π΅Π½. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΅Π³ΠΎ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ²ΠΎΠΉΡΡΠ² ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ
// ΠΎΠ±ΡΠ΅ΠΊΡΠ° Animal.
Animal& animal = animalList_.back();
if (localname == name) {
animal setName(toNative(currentText_));
} else if (localname == species) {
animal.setSpecies(toNative(currentText_));
} else if (localname == dob) {
animal.setDateOfBirth(toNative(currentText_));
}
}
}
// ΠΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
void characters(const XMLCh* const chars,
const unsigned int length) {
// ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² ΠΊΠΎΠ½Π΅Ρ currentText_ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ
// endElement()
currentText_.append(chars, length);
}
private:
vector<Animal>& animalList_;
XercesString currentText_;
};
ΠΡΠΈΠΌΠ΅Ρ 14.7. SAX2 ErrorHandler
#include <stdexcept> // runtime_error
#include <xercesc/sax2/DefaultHandler.hpp>
// ΠΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ .
class CircusErrorHandler : public DefaultHandler {
public:
void warning(const SAXParseException& e) {
/* Π½Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ */
}
void error(const SAXParseExceptionf& e) {
throw runtime_error(toNative(e.getMessage()));
}
void fatalError(const SAXParseException& e) { error(e); }
};
ΠΡΠΈΠΌΠ΅Ρ 14.8. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° animals.xml ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° SAX2
#include <exception>
#include <iostream> // cout
#include <memory> // auto_ptr
#include <vector>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include "animal.hpp"
#include "xerces_strings.hpp" // ΠΡΠΈΠΌΠ΅Ρ 14.4
using namespace std;
using namespace xercesc;
// Π£ΡΠΈΠ»ΠΈΡΠ° RAII ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΏΠ°ΡΡΠ΅Ρ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΡΠ΅ΡΡΡΡΡ
// ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ
class XercesInitializer {
public:
XercesInitializer() { XMLPlatformUtils::Initialize(); }
~XercesInitializer() { XMLPlatformUtils::Terminate(); }
private:
// ΠΠ°ΠΏΡΠ΅ΡΠΈΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅
XercesInitializer(const XercesInitializer&);
XercesInitializer& operator=(const XercesInitializer&);
};
int main() {
try {
vector<Animal> animalList;
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Xerces ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠ°ΡΡΠ΅Ρ
XercesInitializer init;
auto_ptr<SAX2XMLReader>
parser(XMLReaderFactory::createXMLReader());
// ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ
CircusContentHandler content(animalList);
CircusErrorHandler error;
parser->setContentHandler(&content);
parser->setErrorHandler(&error);
// ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML
parser->parse("animals.xml");
// ΠΠ°ΠΏΠ΅ΡΠ°ΡΠ°ΡΡ ΠΊΠ»ΠΈΡΠΊΠΈ ΠΆΠΈΠ²ΠΎΡΠ½ΡΡ
for (vector<Animal>::size_type i = 0;
n = animalList.size(); i < n; ++i) {
cout << animalList[i] << "\n";
}
} catch (const SAXException& e) {
cout << "xml error: " << toNative(e.getMessage()) << "\n";
return EXIT_FAILURE;
} catch (const XMLException& e) {
cout << "xml error: " << toNative(e.getMessage()) << "\n";
return EXIT_FAILURE;
} catch (const exception& e) {
cout << e.what() << "\n";
return EXIT_FAILURE;
}
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΡ XML Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π²ΠΈΠ΄Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π‘++. ΠΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΠ°ΡΡΠ΅Ρ TinyXml ΠΈ ΠΏΠ°ΡΡΠ΅Ρ W3C DOM, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ΅ΡΠ΅ΠΏΡΠ΅. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π½ΠΈΡ ΠΏΠ°ΡΡΠ΅Ρ SAX2 ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ΄ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ XML ΠΏΠΎ Ρ ΠΎΠ΄Ρ Π΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°Π½Ρ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²: ContentHandler ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎΠ± ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°Ρ , Π°ΡΡΠΈΠ±ΡΡΠ°Ρ ΠΈ ΠΎ ΡΠ΅ΠΊΡΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML, ErrorHandler ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ , a DTDHandler ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ DTD Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML.
ΠΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°, ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ·Π»ΠΎΠ² Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML, ΠΈ ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ, Π° Π½Π΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π΄Π΅ΡΠ΅Π²Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, ΠΊΠ°ΠΊ Ρ ΡΡΠΎ Π΄Π΅Π»Π°Π» Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.3.
ΠΡΠΈΠΌΠ΅Ρ 14.8 Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ: Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΏΠ°ΡΡΠ΅Ρ SAX2, ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡ ContentHandler ΠΈ ErrorHandler, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ animals.xml ΠΈ ΠΏΠ΅ΡΠ°ΡΠ°Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Animal, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ContentHandler. Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ Π΄Π²Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°: Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΡΠ½ΠΊΡΠΈΡ XMLReaderFactory::createXMLReader() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ SAX2XMLReader, ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ Π² ΡΠ²Π½ΠΎΠΉ ΡΠΎΡΠΌΠ΅; Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ std::auto_ptr, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ° Π΄Π°ΠΆΠ΅ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΡΡΠ΅Π΄Π° Xerces Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ xercesc::XMLPlatformUtils::Initialize(), ΠΈ ΠΎΡΠΈΡΠ΅Π½Π° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ xercesc::XMLPlatformUtils::Terminate(). Π― ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΡ ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΎΡΠΈΡΡΠΊΡ Π² ΠΊΠ»Π°ΡΡΠ΅ XercesInitializer, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ XMLPlatformUtils::Initialize() Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΈ XMLPlatformUtils::Terminate() Π² ΡΠ²ΠΎΠ΅ΠΌ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ΅. ΠΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π²ΡΠ·ΠΎΠ² Terminate(), Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π°Ρ Π²Π°ΡΠ° ΡΠ΅ΡΡΡΡΠ° ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (Resource Acquisition Is Initialization β RAII), ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 8.3.