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
// Обработать "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));
}
// Напечатать клички животных