Минимальный набор
TinyXML содержит в себе:
- tinyxml.h
- tinyxml.cpp
- tinystr.cpp
- tinyxmlerror.cpp
- tinyxmlparser.cpp
Алгоритм работы
проще некуда, попробуем распарсить следующий
кусочек XML документа:
< Parent>
< Child param="param1"
value="value1" />
< Child param="param2"
value="value2" />
< Child param="param3"
value="value3" />
< /Parent >
Текст функции:
//Создаем объект
документа XML и передаем ему имя файла
из которого
//мы будем читать
TiXmlDocument doc(fileName);
//Читаем файл
и проверяем - прочитался ли.
В случае невозможности
//чтения или распарсивания
функция вернет ошибку
if(!doc.LoadFile())
return;
//Класс TiXmlElement
- это основной кирпичик, на которые разбит
//документ XML.
Функция FirstChildElement возвращает первый элемент
в списке
//имя
которого "Parent".
TiXmlElement *element = doc.FirstChildElement("Parent");
//Берем
первый елемент под
именем "Child"
element = element- >FirstChildElement("Child");
//Перебираем все
элементы с именем "Child"
while(element != NULL)
{
//Переменные для
извлечения значений из документа
std::string param;
std::string value;
//Функция QueryValueAttribute
"достает" из документа значения
атрибутов
//Следует сказать,
что функция перегружена для сех основных
типов данных
//включая строки
из стандартной библиотеки
//Если функция
вернула код TIXML_SUCCESS, то параметр считался
if(element- >QueryValueAttribute("param", ¶m) ==
TIXML_SUCCESS &&
element- >QueryValueAttribute("value", &value) == TIXML_SUCCESS)
//Здесь мы производим действия над извлеченными
данными
...
//Выбираем следующий
элемент из списка. Если элемент не существует
//то на следующей
итерации мы выйдем из цикла
element = element- >NextSiblingElement("action");
}
Таким образом,
мы легко и непринужденно можем считать,
к примеру, настройки своей программы
или какие-то типизированные данные. В
XML файле вполне может храниться небольшая
база данных или файл сохранения для игрового
момента ;)
Библиотека TinyXML
предоставляет программисту очень удобный
способ работы с XML. Для примера возьмем
такой фрагмент XML-файла:
< level name="Demo Level 1" >
< entity class="Car" pos="300,250,300" >
< body mass="20" / >
< /entity >
< entity class="Robot" pos="100,250,100" >
< /level >
Теперь фрагмент кода на С++, который иллюстрирует
работу с TinyXML (предварительно подключив
заголовочный файл библиотеки директивой
"#include" и внеся строку "tinyxml.lib"
в конфигурацию линковщика).
//Открываем XML-файл:
TiXmlDocument *xml_file = new TiXmlDocument("путь_к_файлу");
if(!xml_mtl_file- >LoadFile())
return false;
Следует учесть, что файл должен быть валидным,
т. е. не содержать ошибок. Например все
теги должны быть правильным образом закрыты
(< body / > или < body >< /body >) и так далее.
После открытия файла мы находимся в его
корне, поэтому элемент < level > будет являться
первым дочерним элементом всего файла.
Доступ к нему мы можем получить так:
TiXmlElement *xml_level = 0;
xml_level = xml_file- >FirstChildElement("level");
Функция FirstChildElement(имя_элемента) возвращает
указатель на первый дочерний элемент
объекта xml_file. Элемент < level > имеет дочерний
элемент < entity >, поэтому доступ к нему
мы получим уже через xml_level:
TiXmlElement *xml_entity = 0;
xml_entity = xml_level- >FirstChildElement("entity");
Поскольку элементов < entity > у нас несколько,
мы можем циклически пройтись по ним используя
функцию NextSiblingElement(имя_элемента), которая
возвращает указатель на соседний с текущим
элемент XML-файла:
while(xml_entity != NULL)
{
//выполняем различные действия
//...
xml_entity = xml_entity- >NextSiblingElement("entity");
}
Теперь, когда мы знаем как пройтись по
всем элементам XML-файла остается только
один важный и нужный момент - атрибуты
элемента. Получить их значение (типа const
char *) можно так:
//значение атрибута class элемента < entity >
xml_entity- >Attribute("class");
//значение атрибута name элемента < level >
xml_level- >Attribute("name");
Скачать библиотеку и документацию к ней
можно на сайте http://www.grinninglizard.com/tinyxml/
size="3" face="Times New Roman" >.
Комментариев нет:
Отправить комментарий