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

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

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

   return EXIT_FAILURE;

  }

  // Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DOMBuilder для Π°Π½Π°Π»ΠΈΠ·Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° animals.xml.

  DOMPtr<DOMBuilder> parser =

   static_cast<DOMImplementationLS*>(impl)->

    createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0);

  // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ пространства ΠΈΠΌΠ΅Π½ (ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅)

  parser->setFeature(XMLUni::fgDOMNamespaces, true);

  // Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок

  CircusErrorHandler err;

  parser->setErrorHandler(&err);

  // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· animals.xml; здСсь ΠΌΠΎΠΆΠ½ΠΎ

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ URL вмСсто ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°

  DOMDocument* doc =

   parser->parseURI("animals.xml");

  // Найти элСмСнт слона Herby: сначала ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° элСмСнт

  // "animalList".

  DOMElement* animalList = doc->getDocumentElement();

  if (animalList->getTagName() != fromNative("animalList")) {

   cout << "bad document root: "

    << toNative(animalist->getTagName()) << "\n";

   return EXIT_FAILURE;

  }

  // Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ элСмСнты "animal", ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π½Π°ΠΉΡ‚ΠΈ элСмСнт слона

  // Herby.

  DOMNodeList* animals =

   animaIList->getElementsByTagName(fromNative("animal").c_str());

  for (size_t i = 0,

   len = animals->getLength(); i < len; ++i) {

   DOMElement* animal =

    static_cast<DOMElement">(animals->item(i));

   const XMLCh* name = getAnimalName(animal);

   if (name != 0 && name == fromNative("Herby")) {

    // Herby Π½Π°ΠΉΠ΄Π΅Π½ - ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

    animalList->removeChild(animal);

    animal->release();

    // Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€.

    break;

   }

  }

  // Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DOMWriter для сохранСния animals.xml.

  DOMPtr<DOMWriter> writer =

   static cast<DOMImplementationLS*>(impl)->createDOMWriter();

  writer->setErrorHandler(&err);

  // Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ animals.xml.

  LocalFileFormatTarget file("animals.xml");

  writer->writeNode(&file, *animalList);

 } catch (const SAXException& e) {

  cout << "xml error: " << toNative(e.getMessage()) << "\n";

  return EXIT_FAILURE;

 } catch (const DOMException& e) {

  cout << "xml error: " << toNative(e.getMessage()) << "\n";

  return EXIT_FAILURE;

 } catch (const exception& e) {

  cout << e.what() << "\n";

  return EXIT_FAILURE;

 }

}

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

Подобно парсСру TinyXml парсСр Xerces DOM Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° C++, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ структуру Π΄Π΅Ρ€Π΅Π²Π°, ΡƒΠ·Π»Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. Однако парсСр Xerces сущСствСнно слоТнСС: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ TinyXml ΠΎΠ½ Β«ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Β» пространства ΠΈΠΌΠ΅Π½ XML ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· слоТных DTD. Π­Ρ‚ΠΈΠΌ парсСром Ρ‚Π°ΠΊΠΆΠ΅ формируСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ инструкции ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ URI пространств ΠΈΠΌΠ΅Π½, относящиСся ΠΊ элСмСнтам ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ. ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ прСдоставляСт доступ ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· интСрфСйс, описанный Π² спСцификации W3C DOM.

БпСцификация W3C, которая всС Π΅Ρ‰Π΅ дорабатываСтся, ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Β«ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉΒ»; Π² настоящСС врСмя прСдусматриваСтся Ρ‚Ρ€ΠΈ уровня. ΠšΠ»Π°ΡΡΡ‹ DOMImplementation, DOMDocument, DOMElement ΠΈ DOMNodeList, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.10, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ 1 спСцификации DOM. ΠšΠ»Π°ΡΡΡ‹ DOMBuilder ΠΈ DOMWrite ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ 3 спСцификации DOM ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сохранСния (Load ΠΈ Save).

ИмСна классов Xerces Π½Π΅ всСгда ΡΠΎΠ²Π»Π°Π΄Π°ΡŽΡ‚ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ интСрфСйсов W3C DOM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚; это происходит ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Xerces Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ нСсколько спСцификаций Π² ΠΎΠ΄Π½ΠΎΠΌ пространствС ΠΈΠΌΠ΅Π½ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прСфиксы Π² ΠΈΠΌΠ΅Π½Π°Ρ… классов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π½.

ПониманиС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.10 Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π½ΠΈΠΉ. Π― Π½Π°Ρ‡ΠΈΠ½Π°ΡŽ с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Xerces, ΠΊΠ°ΠΊ это дСлаСтся Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.8. Π—Π°Ρ‚Π΅ΠΌ я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ DOMImplementation ΠΈΠ· DOMImplementationRegistry, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сохранСния ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ строки Β«LSΒ» статичСскому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ DOMImplementationRegistry::getDOMImplementation(). На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ DOMBuilder ΠΈΠ· DOMImplementation. МнС приходится Ρ‚ΠΈΠΏ DOMImplementation привСсти ΠΊ Ρ‚ΠΈΠΏΡƒ DOMImplementationLS, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ функция Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сохранСния нСдоступна ΠΈΠ· интСрфСйса DOMImplementation согласно спСцификации W3C DOM уровня 1. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ createDOMBuilder() ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ парсСр Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² синхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ асинхронный Ρ€Π΅ΠΆΠΈΠΌ, Π² настоящСС врСмя Π½Π΅ поддСрТиваСтся Π² Xerces.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² DOMBuilder, я Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ пространства ΠΈΠΌΠ΅Π½ XML, Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ErrorHandler ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽ синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. ΠŸΠ°Ρ€ΡΠ΅Ρ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² Π²ΠΈΠ΄Π΅ DOMDocument; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ getElementsByTagName() Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° DOMDocument, я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DOMElement, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнту этого Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° animalList, ΠΈ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° DOMNodeList. Когда я Π½Π°Ρ…ΠΎΠΆΡƒ элСмСнт, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт Ρ‚ΠΈΠΏΠ° name ΠΈ содСрТащий тСкст Β«HerbyΒ», я ΡƒΠ΄Π°Π»ΡΡŽ Π΅Π³ΠΎ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ элСмСнта removeChild().

Подобно Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ SAX2XMLReader ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ parse(), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ экзСмпляр InputSource, DOMBuilder ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ» parse(), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ экзСмпляр xercesc::DOMInputSource (Ρ‚.Π΅. экзСмпляр абстрактного класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт источник ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…). Π’ DOMInputSource прСдусмотрСн ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ подкласс Wrapper4DOMInputSource, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для прСобразования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ InputSource Π² xercesc::DOMInputSource. Π‘ΠΌ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ 14.3.

НаконСц, я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DOMWriter ΠΈΠ· DOMImplementation (ΠΏΡ€ΠΈΡ‡Π΅ΠΌ дСлаю это Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° DOMBuilder) ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML Π½Π° диск, вызывая Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ writeNode(), пСрСдавая Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ элСмСнт Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π²ΠΈΠ΄Π° DOMImplementation::createXXX(), ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° release(). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ DOMPtr ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.10 для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ освобоТдСниС Ρ‚Π°ΠΊΠΎΠ³ΠΎ указатСля, Π΄Π°ΠΆΠ΅ Ссли выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ явно ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΠ΄ DOMDocument::createXXX(), хотя это ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Xerces.

14.5. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML Π½Π° соотвСтствиС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ DTD

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

ВрСбуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML Π½Π° соотвСтствиС DTD.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Xerces с парсСром SAX2 (простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ XML-интСрфСйс) ΠΈΠ»ΠΈ с парсСром DOM.

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML ΠΏΡ€ΠΈ использовании SAX2 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ SAX2XMLReader, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.8. Π—Π°Ρ‚Π΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ DTD, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ парсСра setFeature() с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ xercesc::XMLUni::fgSAX2CoreValidation ΠΈ true. НаконСц, зарСгистрируйтС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ErrorHandler для получСния ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ DTD ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ парсСра parse(), указывая Π² качСствС Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя вашСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML.

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML ΠΏΡ€ΠΈ использовании парсСра DOM сначала сконструируйтС экзСмпляр XercesDOMParser. Π—Π°Ρ‚Π΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ DTD, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ парсСра setValidationScheme() с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ xercesc::XercesDOMParser::Val_Always. НаконСц, зарСгистрируйтС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ErrorHandler для получСния ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ DTD ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ парсСра parse(), указывая Π² качСствС Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя вашСго Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML.

Π—Π΄Π΅ΡΡŒ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ класс XercesDOMParser, Ρ‚.Π΅. XML-парсСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ΠΈΠ» Π² состав Xerces Π΅Ρ‰Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ интСрфСйс DOMBuilder β€” парсСра DOM уровня 3. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ XercesDOMParser позволяСт Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ вмСсто Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DOMBuilder. Π‘ΠΌ. обсуТдСниС этого Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π° ΠΈ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ 14.4.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML animals.xml ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.1 для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ содСрТал ссылку Π½Π° внСшнСС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ DTD, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… 14.11 ΠΈ 14.12. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с использованиСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса SAX2, приводится Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.13; ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ этого Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с использованиСм парсСра DOM, приводится Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.14.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.11. DTD animals.dtd для Ρ„Π°ΠΉΠ»Π° animals.xml

<!-- DTD для ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… Ρ†ΠΈΡ€ΠΊΠ° Feldman Family Circus -->

<!ELEMENT animalList (animal+)>

<!ELEMENT animal (name, species, dateOfBirth,

                  veterinarian, trainer) >

<!ELEMENT name (#PCDATA)>

<!ELEMENT species (#PCDATA)>

<!ELEMENT dateOfBirth (#PCDATA)>

<!ELEMENT veterinarian EMPTY>

<!ELEMENT trainer EMPTY>

<!ATTLIST veterinarian

 name  CDATA #REQUIRED

 phone CDATA #REQUIRED

>

<!ATTLIST trainer