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

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

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

 }

 // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт Π΄Π°Ρ‚Ρ‹ роТдСния

 element = element->NextSiblingElement();

 if (element && strcmp(element->Value(), "dateOfBirth") == 0) {

  // Π’Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом animal являСтся Π΄Π°Ρ‚Π° роТдСния

  // (элСмСнт "dateOfBirth"));

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для установки Π΄Π°Ρ‚Ρ‹

  // роТдСния Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ result

  result.setDateOfBirth(textValue(element));

 } else {

  throw runtime_error("no dateOfBirth attribute");

 }

 // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт Π²Π΅Ρ‚Π΅Ρ€ΠΈΠ½Π°Ρ€Π°

 element = element->NextSiblingElement();

 if (strcmp(element->Value(), "veterinarian") == 0) {

  // Π§Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом animal являСтся Π²Π΅Ρ‚Π΅Ρ€ΠΈΠ½Π°Ρ€ (элСмСнт

  // "veterinarian"); ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ для конструирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

  // Contact ΠΈ установки ΠΈΠΌΠ΅Π½ΠΈ Π²Π΅Ρ‚Π΅Ρ€ΠΈΠ½Π°Ρ€Π° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ result

  result.setVeterinarian(nodeToContact(element));

 } else {

  throw runtime_error("no veterinarian attribute");

 }

 // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт дрСссировщика

 element = element->NextSiblingElement();

 if (strcmp(element->Value(), "trainer") == 0) {

  // ΠŸΡΡ‚Ρ‹ΠΌ элСмСнтом animal являСтся дрСссировщик (элСмСнт "trainer");

  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ для конструирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

  // Contact ΠΈ установки дрСссировщика Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ result

  result.setTrainer(nodeToContact(element));

 } else {

  throw runtime_error("no trainer attribute");

 }

 // Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² отсутствии Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов

 element = element->NextSiblingElement();

 if (element != 0) {

  throw runtime_error(

   string("unexpected element:") + element->Value()

  );

 }

 return result;

}


int main() {

 using namespace std;

 try {

  vector<Animal> animalList;

  // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ "animals.xml"

  TiXmlDocument doc("animals.xml");

  if (!doc.LoadFile())

   throw runtime_error("bad parse");

  // Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ являСтся список ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…

  TiXmlElement* root = doc.RootElement();

  if (strcmp(root->Value(), "animalList") != 0) {

   throw runtime_error(string("bad root: ") + root->Value());

  }

  // ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ элСмСнта, заполняя

  // список ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…

  for (TiXmlElement* animal = root->FirstChildElement();

   animal; animal = animal->NextSiblingElement()) {

   animalList.push_back(nodeToAnimal(animal));

  }

  // ΠΠ°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΡ‡ΠΊΠΈ ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…

  for (vector<Animal>::size_type i = 0, n = animalList.size(); i < n; ++i) {

   cout << animalList[i] << "\n";

  }

 } catch (const exception& e) {

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

  return EXIT_FAILURE;

 }

}

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

TinyXml (Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Β«ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹ΠΉ XMLΒ») ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML. Дистрибутив исходных тСкстов этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ нСбольшой, Π΅Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, ΠΈ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ простой интСрфСйс. Она Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π»ΠΈΠ±Π΅Ρ€Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡŽ. Π“Π»Π°Π²Π½Ρ‹ΠΌΠΈ ограничСниями TinyXml ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅Π²ΠΎΡΠΏΡ€ΠΈΠΈΠΌΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ пространствам ΠΈΠΌΠ΅Π½ XML, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ контроля DTD ΠΈΠ»ΠΈ схСмы, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ DTD. Если Π²Π°ΠΌ трСбуСтся какая-Ρ‚ΠΎ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ какая-Π½ΠΈΠ±ΡƒΠ΄ΡŒ XML-тСхнология, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, XPath ΠΈΠ»ΠΈ XSLT, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, рассмотрСнными Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅.

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ парсСра TinyXml получаСтся Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π°, ΡƒΠ·Π»Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ элСмСнты, тСкст, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML. ΠšΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° прСдставляСт собствСнно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML. Π’Π°ΠΊΠΎΠ΅ иСрархичСскоС прСдставлСниС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° называСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ модСлью Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° (Document Object Model - DOM). МодСль DOM, получСнная парсСром TinyXml, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ консорциумом W3C (World Wide Web Consortium), хотя ΠΎΠ½Π° ΠΈ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ соотвСтствуСт спСцификации W3C. ВслСдствиС привСрТСнности Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ TinyXml ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΠΌΠ° модСль TinyXml DOM ΠΏΡ€ΠΎΡ‰Π΅ W3Π‘ DOM, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ мСньшими возмоТностями.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΡƒΠ·Π»Π°ΠΌ Π΄Π΅Ρ€Π΅Π²Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML, ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйса TiXmlNode, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ доступ ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊΠΎ всСм Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΡƒΠ·Π»Π°ΠΌ, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΡƒΠ·Π»ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» являСтся экзСмпляром Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° являСтся экзСмпляром TiXmlDocument, ΡƒΠ·Π»Ρ‹ элСмСнтов ΡΠ²Π»ΡΡŽΡ‚ΡΡ экзСмплярами TiXmlElement, Π° ΡƒΠ·Π»Ρ‹, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ тСкст, ΡΠ²Π»ΡΡŽΡ‚ΡΡ экзСмплярами TiXmlText. Π’ΠΈΠΏ TiXmlNode ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π’ΡƒΡ€Π΅(); зная Ρ‚ΠΈΠΏ ΡƒΠ·Π»Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π΅Π³ΠΎ прСдставлСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠ°ΠΊ toDocument(), toElement() ΠΈ toText(). Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ содСрТат Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ для ΡƒΠ·Π»ΠΎΠ² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ нСслоТно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ 14.3. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, функция textValue() ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ тСкстовоС содСрТимоС ΠΈΠ· элСмСнтов, содСрТащих Ρ‚ΠΎΠ»ΡŒΠΊΠΎ тСкст, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ name, species ΠΈΠ»ΠΈ dateOfBirth. Π’ этом случаС данная функция сначала убСТдаСтся, Ρ‡Ρ‚ΠΎ имССтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ являСтся тСкстовым ΡƒΠ·Π»ΠΎΠΌ. Она Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ тСкст Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ элСмСнта, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ Value(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ тСкстовоС содСрТимоС тСкстового ΡƒΠ·Π»Π° ΠΈΠ»ΠΈ ΡƒΠ·Π»Π° коммСнтария, имя Ρ‚Π΅Π³Π° ΡƒΠ·Π»Π° элСмСнта ΠΈ имя Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС функция nodeToContact() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ·Π΅Π», ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнту veterinarian ΠΈΠ»ΠΈ trainer, ΠΈ конструируСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Contact ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² name ΠΈ phone, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Attribute().

Аналогично функция nodeToAnimal() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ·Π΅Π», ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнту ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ element, ΠΈ конструируСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Animal. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΡƒΠ·Π»Π°ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° NextSiblingElement(), извлСкая ΠΏΡ€ΠΈ этом содСрТащиСся Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ элСмСнтС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ устанавливая ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ свойство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Animal. Π”Π°Π½Π½Ρ‹Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ textValue() для элСмСнтов name, species ΠΈ dateOfBirth ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ nodeToContact() для элСмСнтов veterinarian ΠΈ trainer.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main я сначала ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TiXmlDocument ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ»Ρƒ animals.xml, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽ Π΅Π³ΠΎ синтаксичСский Ρ€Π°Π·Π±ΠΎΡ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° LoadFile(). Π—Π°Ρ‚Π΅ΠΌ я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ элСмСнт TiXmlElement, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΡ€Π½ΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ RootElement(). На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС я ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ всС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΡƒΠ·Π»Ρ‹ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ элСмСнта, конструируя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Animal ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта animal с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ nodeToAnimal(). НаконСц, я ΠΏΡ€ΠΎΡ…ΠΎΠΆΡƒ ΠΏΠΎ всСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Animal, записывая ΠΈΡ… Π² стандартный Π²Ρ‹Π²ΠΎΠ΄.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.3 Π½Π΅ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΎΠ΄Π½Π° функция Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ TinyXml, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ SaveFile() класса TiXmlDocument, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ записываСт Π² Ρ„Π°ΠΉΠ» Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, прСдставляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ TiXmlDocument. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Ρ€Π°Π·Π±ΠΎΡ€ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ интСрфСйс DOM, ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ TiXmlDocument ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ с чистого листа ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° дискС.

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ hello.xml, состоящий

// ΠΈΠ· СдинствСнного элСмСнта "hello"

TiXmlDocument doc;

TiXmlElement root("hello");

doc.InsertEndChild(root);

doc.SaveFile("hello.xml");

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ 14.3 ΠΈ 14.4.

14.2. Π Π°Π±ΠΎΡ‚Π° со строками Xerces

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

ВрСбуСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΈ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ со строками с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Xerces. Π’ частности, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ строки, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ функциями Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Xerces, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ строками Xerces ΠΈ строками стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘++.

РСшСниС

Π‘ΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ строки с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ функциями Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Xerces, ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ шаблона std::basic_string, спСциализированного Ρ‚ΠΈΠΏΠΎΠΌ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов XMLCh Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Xerces.

typedef std::basic_string<XMLCh> XercesString;

Для выполнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ строками Xerces ΠΈ строками, состоящими ΠΈΠ· стандартных символов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ transcode() ΠΈΠ· класса xercesc::XMLString, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ xercesc/util/XMLString.hpp.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.4 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, toNative ΠΈ fromNative, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ transcode для прСобразования строк со стандартными символами Π² строки Xerces ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. КаТдая функция ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ вСрсии: ΠΎΠ΄Π½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку Π² C-стилС, Π° другая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘++. Для выполнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ строками Xerces ΠΈ строками со стандартными символами Π²ΠΏΠΎΠ»Π½Π΅ достаточно ΠΈΠΌΠ΅Ρ‚ΡŒ эти слуТСбныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Π°ΠΌ ΡƒΠΆΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ потрСбуСтся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ нСпосрСдствСнно transcode.