>
<!ATTLIST trainer
name CDATA #REQUIRED
phone CDATA #REQUIRED
>
ΠΡΠΈΠΌΠ΅Ρ 14.12. ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» animals.xml, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ DTD
<?xml version="1.0" encodings "UTF-8"?>
<!-- ΠΠΈΠ²ΠΎΡΠ½ΡΠ΅ ΡΠΈΡΠΊΠ° Feldman Family Circus Ρ DTD. -->
<!DOCTYPE animalList SYSTEM "animals.dtd">
<!- ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.1 -->
</animalList>
ΠΡΠΈΠΌΠ΅Ρ 14.13. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° animals.xml Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ DTD Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° SAX2
/*
* ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ #include ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠ° 14.8, ΠΊΡΠΎΠΌΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²Π΅ΠΊΡΠΎΡΠ° <vector> ΠΊΠΎΡΠΎΡΡΠΉ
Π·Π΄Π΅ΡΡ Π½Π΅ Π½ΡΠΆΠ΅Π½
*/
#include <stdexcept> // runtime_error
#include <xercesc/sax2/DefaultHandler.hpp>
using namespace std;
using namespace xercesc;
/*
* ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ XercesInitializer, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.8, ΠΈ
* CircusErrorHandler, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.7
*/
int main() {
try {
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Xerces ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠ°ΡΡΠ΅Ρ
SAX2 XercesInitializer init;
auto_ptr<SAX2XMLReader>
parser(XMLReaderFactory::createXMLReader());
// ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
// ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ
// Π½Π°ΡΡΡΠ΅Π½ΠΈΡΡ DTD
CircusErrorHandler error;
parser->setErrorHandler(&error);
parser->parse("animals.xml");
} 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;
}
}
ΠΡΠΈΠΌΠ΅Ρ 14.14. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° animals.xml Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ DTD animals.dtd Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΡΡΠ΅ΡΠ° XercesDOMParser
#include <exception>
#include <iostream> // cout
#include <stdexcept> // runtime_error
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include "xerces_strings.hpp" // ΠΡΠΈΠΌΠ΅Ρ 14.4
using namespace std;
using namespace xercesc;
/*
* ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ XercesInitializer, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.8
* ΠΈ CircusErrorHandler, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.7
*/
int main() {
try {
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Xerces ΠΈ ΡΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ DOM-ΠΏΠ°ΡΡΠ΅Ρ.
XercesInitializer init;
XercesDOMParser parser;
// ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ DTD
parser.setValidationScheme(XercesDOMParser::Val_Always);
// ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ
// Π½Π°ΡΡΡΠ΅Π½ΠΈΡΡ ΡΡ Π΅ΠΌΡ
CircusErrorHandler handler;
parser.setErrorHandler(&handler);
// ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ.
parser.parse("animals.xml");
} 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;
}
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ DTD ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ XML. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² DTD ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, ΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ ΠΈ ΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΎΠ΅. ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠΈΠΏ, ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
DTD ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² XML, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½Ρ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.1 Π²Π°ΠΆΠ½ΠΎ ΡΠΎ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ animal ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ name, species, dateOfBirth, veterinarian ΠΈ trainer, Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ name, species ΠΈ dateOfBirth ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΡ Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ, ΠΊΠ°ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ veterinarian ΠΈ trainer ΠΈΠΌΠ΅ΡΡ Π°ΡΡΠΈΠ±ΡΡΡ name ΠΈ phone. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΡΠ»Π΅ΠΌΠ΅Π½Ρ animal Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π°ΡΡΠΈΠ±ΡΡ phone, Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ veterinarian Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ species.
DTD Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.11 Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π½Π°Π»ΠΈΡΠΈΡ Π² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ ΠΆΠΈΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² name, species, dateOfBirth, veterinarian ΠΈ trainer, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅.
<!ELEMENT animal (name, species, dateOfBirth,
veterinarian, trainer) >
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ trainer Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π°ΡΡΠΈΠ±ΡΡΡ name ΠΈ phone, Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π² DTD ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ Π΄ΡΡΠ³ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° Π°ΡΡΠΈΠ±ΡΡΠ°.
<!ATTLIST trainer
name CDATA #REQUIRED
phone CDATA #REQUIRED
>
ΠΠΎΠΊΡΠΌΠ΅Π½Ρ XML, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ DTD ΠΈ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ Π΅Π³ΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ, Π½Π°Π·ΡΠ²Π°ΡΡ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΡΠΌ (valid). XML-ΠΏΠ°ΡΡΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½ΠΎ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML. Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡΠΈΠΌ ΠΏΠ°ΡΡΠ΅ΡΠΎΠΌ (validating parser). Π₯ΠΎΡΡ ΠΏΠ°ΡΡΠ΅ΡΡ SAX2XMLReader ΠΈ XercesDOMParser Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡΠΈΠΌΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ°ΠΌΠΈ, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ 14.13 ΠΈ 14.14. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΠ°ΡΡΠ΅Ρ DOMBuilder, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 14 4, ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML, Π²ΡΠ·ΡΠ²Π°Ρ ΡΠ²ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ setFeaturΠ΅() Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ fgXMLUni::fgDOMValidation ΠΈ true.
ΠΠ»Π°ΡΡΡ SAX2XMLReader, DOMBuilder, DOMWriter ΠΈ XercesDOMParser ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠ΄ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ. Π SAX2XMLReader ΠΈ DOMBuilder Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ setFeature() ΠΈ setProperty(). ΠΠ΅ΡΠ²ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ ΠΈ Π±ΡΠ»Π΅Π²ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: Π²ΡΠΎΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ ΠΈ void*. ΠΠ°ΠΏΡΠΎΡΠΈΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² getFeature() ΠΈ getProperty(). ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° Π² Xerces ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΡΠΈΠΊΡΠΈΠΉ ΠΈ ΡΠ²ΠΎΠΉΡΡΠ². ΠΠ»Π°ΡΡ DOMWriter ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ setFeature(), Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ setProperty(). ΠΠ»Π°ΡΡ XercesDOMParser ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ±Π° ΠΌΠ΅ΡΠΎΠ΄Π°, Π² Π½Π΅ΠΌ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Xerces Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅Π Π΅ΡΠ΅ΠΏΡ 14.6.
14.6. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΡ Π΅ΠΌΠ΅
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML ΡΡ Π΅ΠΌΠ΅, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ Π² ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡΡ XML Schema 1.0.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Xerces ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ SAX2 ΠΈΠ»ΠΈ Ρ ΠΏΠ°ΡΡΠ΅ΡΠΎΠΌ DOM.
ΠΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML ΡΡ Π΅ΠΌΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° SAX2 ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ DTD, ΠΊΠΎΠ³Π΄Π° ΡΡ Π΅ΠΌΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π½Π° Π½Π΅Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° Π² ΡΡΠΎΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅. ΠΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ XML Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΡ Π΅ΠΌΠ΅, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ°ΡΡΠ΅ΡΠ° setProperty() Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΡ Π΅ΠΌΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° setProperty() Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ XMLUni::fgXercesSchemaExternalSchemaLocation ΠΈΠ»ΠΈ XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡΡΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ Π² ΡΡ Π΅ΠΌΠ΅ ΡΠ΅Π»Π΅Π²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½. ΠΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΌΠ΅ΡΡΠΎ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡ Π΅ΠΌΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠ° const XMLCh*. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠΈΠΏ Π²ΡΠΎΡΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊ void*, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 14.5.
ΠΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML ΡΡ Π΅ΠΌΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ XercesDOMParser Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° DTD, ΠΊΠΎΠ³Π΄Π° ΡΡ Π΅ΠΌΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π½Π° Π½Π΅Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° Π² ΡΡΠΎΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠ²Π½ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ΅Π΄ΡΡΠ² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΡ Π΅ΠΌΡ ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 14.15.
ΠΡΠΈΠΌΠ΅Ρ 14.15. ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΡ Π΅ΠΌΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ XercesDOMParser
XercesDOMParser parser;
parser.setValidationScheme(XercesDOMParser::Val_Always);
parser.setDoSchema(true);
parser setDoNamespaces(true);
ΠΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ XML Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΡ Π΅ΠΌΠ΅, ΠΈΠΌΠ΅ΡΡΠ΅ΠΉ ΡΠ΅Π»Π΅Π²ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½, Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ°ΡΡΠ΅ΡΠ° setExternalSchemaLocation(), ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΌΠ΅ΡΡΠΎ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π°ΡΠ΅ΠΉ ΡΡ Π΅ΠΌΡ. ΠΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ XML Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΡ Π΅ΠΌΠ΅, Π½Π΅ ΠΈΠΌΠ΅ΡΡΠ΅ΠΉ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½, Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ°ΡΡΠ΅ΡΠ° setExternalNoNamespaceSchemaLocation().