// животного.

   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 видно, насколько сложным может быть проверка

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату