вторник, 27 апреля 2010 г.

Шпаргалка по TinyXML

Материал взят отсюда

Минимальный набор
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", &param) ==
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" >.

Комментариев нет:

Отправить комментарий

Постоянные читатели

Архив блога