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
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
Мастер 3
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Лучше подавать холодным
4. Земной круг. Первый Закон
Фантастика:
фэнтези
8.45
рейтинг книги
Имперец. Земли Итреи
11. Путь
Фантастика:
героическая фантастика
боевая фантастика
5.25
рейтинг книги
Адвокат империи
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Ваше Сиятельство 2
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Не грози Дубровскому!
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Отмороженный 7.0
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Лолита
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Энфис 5
5. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Опасная любовь командора
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Найди меня Шерхан
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70