Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

// в объекте result

result.setName(textValue(element));

 } else {

throw runtime_error("no name attribute");

 }

 // Прочитать элемент вида животного

 element = element->NextSiblingElement;

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

// Вторым дочерним элементом animal
является вид животного

// (элемент "species"); используйте его текстовое значение для

// установки вида в объекте result

result.setSpecies(textValue(element));

 } else {

throw runtime_error(""no species attribute");

 }

 // Прочитать элемент даты рождения

 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, то необходимо воспользоваться другими библиотеками, рассмотренными в данной главе.

Поделиться:
Популярные книги

Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Ланьлинский насмешник
Старинная литература:
древневосточная литература
7.00
рейтинг книги
Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

70 Рублей - 2. Здравствуй S-T-I-K-S

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Лучше подавать холодным

Аберкромби Джо
4. Земной круг. Первый Закон
Фантастика:
фэнтези
8.45
рейтинг книги
Лучше подавать холодным

Имперец. Земли Итреи

Игнатов Михаил Павлович
11. Путь
Фантастика:
героическая фантастика
боевая фантастика
5.25
рейтинг книги
Имперец. Земли Итреи

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Энфис 5

Кронос Александр
5. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 5

Опасная любовь командора

Муратова Ульяна
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Опасная любовь командора

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан