: animalList_(animalList), // заполняемый список

  parsingAnimalList_(false), // состояние анализа

  parsingAnimal_(false),     // состояние анализа

  parsingAnimalChild_(false) // состояние анализа

  {}

 // Получает уведомления от парсера при каждой встрече начала

 // какого-нибудь элемента

 void startElement(

  const XMLCh *const uri,       // uri пространства имен

  const XMLCh *const localname, // простое имя тега

  const XMLCh *const qname,     // квалифицированное имя тега

  const Attributes &attrs)      // Набор атрибутов

 {

  static XercesString animalList = fromNative("animalList");

  static XercesString animal = fromNative("animal");

  static XercesString xmlns =

   fromNative("http://www.feldman-family-circus.com");

  // Проверяет uri пространства имен

  if (uri != xmlns)

   throw runtime_error(

    string("wrong namespace uri: ") + toNative(uri)

   );

  // (i)   Обновить флаги parsingAnimalList_, parsingAnimal_

  //       и parsingAnimalChild_, которые показывают, в какой части

  //       документа мы находимся

  // (ii)  Убедиться, что элементы имеют правильную вложенность

  //

  // (iii) Делегировать основную работу методу

  // startAnimalChild()

  if (!parsingAnimalList_) {

   // Мы только что встретили корень документа

   if (localname == animalList) {

    parsingAnimalList_ = true; // Обновить состояние анализа.

   } else {

    // Неправильная вложенность

    throw runtime_error(

     string("expected 'animalList', got ") + toNative(localname)

    );

   }

  } else if (!parsingAnimal_) {

   // Мы только что встретили новое животное

   if (localname == animal) {

    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;

Перейти на страницу:

Похожие книги