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

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

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

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

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.