parsingAnimal_ = true; // ΠΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
// Π°Π½Π°Π»ΠΈΠ·Π°.
animalList_.push_back(Animal()); // ΠΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ
// Animal.
} else {
// ΠΠ΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΡ
throw runtime error(
string("expected 'animal', got ") + toNative(localname)
);
}
} else {
// ΠΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ΅Π³ΠΎ
// ΠΆΠΈΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ.
if (parsingAnimalChild_) {
// ΠΠ΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΡ
throw runtime_error("bad animal element");
}
// ΠΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°
parsingAnimalChild_ = true;
// ΠΡΡΡΡ startAnimalChild() Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ
startAnimalChild(uri, localname, qname, attrs);
}
}
void endElement(
const XMLCh *const uri, // uri ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½
const XMLCh *const localname, // ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈΠΌΡ ΡΠ΅Π³Π°
const XMLCh *const qname ) // ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ΅Π³Π°
{
static XercesString animalList = fromNative("animal-list");
static XercesString animal = fromNative("animal");
// ΠΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠ»Π°Π³ΠΈ parsingAnimalList, parsingAnimal_
// ΠΈ parsingAnimalChild_; Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ°Π±ΠΎΡΡ
// endAnimalChild()
if (localname == animal) {
parsingAnimal_ = false;
} else if (localname == animalList) {
parsingAnimalList_ = false;
} else {
endAnimalChild(uri, localname, qname);
parsingAnimalChild_ = false;
}
}
// ΠΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ Π²ΡΡΡΠ΅ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ
void characters(const XMLCh* const chars, const unsigned int length) {
// ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² ΠΊΠΎΠ½Π΅Ρ currentText_ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ
// endAnimalChild()
currentText.append(chars, length);
}
private:
// ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π΅ΡΠ΅ΡΠΈΠ½Π°ΡΠ° ΠΈΠ»ΠΈ Π΄ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ°,
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ attrs Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Contact Π΄Π»Ρ
// ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Animal; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΡΡΠΈΡΠ΅ currentText_,
// ΠΏΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² characters()
void startAnimalChild(
const XMLCh *const uri, // uri ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½
const XMLCh *const localname, // ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈΠΌΡ ΡΠ΅Π³Π°
const XMLCh *const qname, // ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ΅Π³Π°
const Attributes &attrs ) // ΠΠ°Π±ΠΎΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ²
{
static XercesString vet = fromNative("veterinarian");
static XercesString trainer = fromNative("trainer");
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 endAnimalChild(
const XMLCh *const uri, // uri ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½
const XMLCh *const localname, // ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈΠΌΡ ΡΠ΅Π³Π°
const XMLCh *const qname) // ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ΅Π³Π°
{
static XercesString name = fromNative("name");
static XercesString species = fromNative("species");
static XercesString dob = fromNative("dateOfBirth");
// 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_));
}
}
vector<Animal>& animalList_; // Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠΏΠΈΡΠΎΠΊ
bool parsingAnimalList_; // ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°
bool parsingAnimal_; // ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°
bool parsingAnimalChild_; // ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°
XercesString currentText_; // ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ
// ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ·Π»Π°
};
ΠΠ· ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° 14.9 Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ 14.6 Π²ΠΈΠ΄Π½ΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΡΠΊΡΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.6 Π½Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ, ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.3: Π·Π΄Π΅ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΆΠΈΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ. Π ΡΡΠ°ΡΡΡΡ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ SΠΠ₯2, ΠΊΠ°ΠΊ Π²Ρ ΡΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ°Ρ 14.5 ΠΈ 14.6.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅Π Π΅ΡΠ΅ΠΏΡΡ 14.1, 14.4, 14.5 ΠΈ 14.6.
14.4. ΠΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠΌ XML
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ XML Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π‘++, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ, ΡΠ΅ΠΊΡΡΠΎΠΌ, DTD, ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π² Xerces ΠΌΠΎΠ΄Π΅Π»Ρ W3C DOM. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠ»Π°ΡΡ xercesc::DOMImplementationRegistry Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° xercesc::DOMImplementation, Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ DOMImplementation Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΏΠ°ΡΡΠ΅ΡΠ° xercesc::DOMBuilder. ΠΠ° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π³Π΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ xercesc::DOMErrorHandler Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ , ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ Π² Ρ ΠΎΠ΄Π΅ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΈ Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ°ΡΡΠ΅ΡΠ° parseURI(), ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° URI Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°. ΠΡΠ»ΠΈ Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΌΠ΅ΡΠΎΠ΄ parseURI Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ DOMDocument, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ XML. ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ W3C DOM Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠΌ.
ΠΠ±ΡΠ°Π±ΠΎΡΠ°Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΉΠ»Π΅, ΠΏΠΎΠ»ΡΡΠ°Ρ DOMWriter ΠΈΠ· DOMImplementation ΠΈ Π²ΡΠ·ΡΠ²Π°Ρ Π΅Π³ΠΎ ΠΌΠ΅ΡΠΎΠ΄ writeNode() Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° DOMDocument Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
ΠΡΠΈΠΌΠ΅Ρ 14.10 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ DOM Π΄Π»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° animals.xml, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.1, Π·Π°ΡΠ΅ΠΌ Π½Π°ΠΉΡΠΈ ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ·Π΅Π», ΠΎΡΠ½ΠΎΡΡΡΠΈΠΉΡΡ ΠΊ ΡΠ»ΠΎΠ½Ρ Herby, ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ.
ΠΡΠΈΠΌΠ΅Ρ 14.10. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ DOM Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ, ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML
#include <exception>
#include <iostream> // cout
#include <xercesc/dom/DOM.hpp>
#include <xercesc/framework/LocalFileFomatTarget.hpp>
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include "animal.hpp"
#include "xerces_strings.hpp"
using namespace std;
using namespace xercesc;
/*
* ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ XercesInitializer, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.8
*/
// Π£ΡΠΈΠ»ΠΈΡΠ° RAII, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΡΠ΅ΡΡΡΡ ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΠ· ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ.
template<typename T>
class DOMPtr {
public:
DOMPtr(T* t) : t_(t) {}
~DOMPtr() { t_->release(); }
T* operator->() const { return t_; }
private:
// Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅
DOMPtr(const DOMPtr&);
DOMPtr& operator=(const DOMPtr&);
T* t_;
};
// Π‘ΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ , ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ Π² Ρ ΠΎΠ΄Π΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Ρ
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ DOMBuilder.
class CircusErrorHandler : public DOMErrorHandler {
public:
bool handleFrror(const DOMError& e) {
std::cout << toNative(e.getMessage()) << "\n";
return false;
}
};
// ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° "name", Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ
// "animal".
const XMLCh* getAnimalName(const DOMElement* animal) {
static XercesString name = fromNative("name");
// ΠΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° animal
DOMNodeList* children = animal->getChildNodes();
for (size_t i = 0, len = children->getLength(); i < Len; ++i) {
DOMNode* child = children->item(i);
if (child->getNodeType() == DOMNode::ELEMENT_NODE &&
static_cast<DOMElement*>(child)->getTagName() == name) {
// ΠΡ Π½Π°ΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ "name".
return child->getTextContent();
}
}
return 0;
}
int main() {
try {
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Xerces ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ DOMImplementation;
// ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ (Load and
// Save - LS)
XercesInitializer init;
DOMImplementation* impl =
DOMImplementationRegistry::getDOMImplementation(fromNative("LS").c_str()
);
if (impl == 0) {
cout << "couldn't create DOM implementation\n";