Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с XML в C++, Как прочитать данные в XML файле? 
:(
    Опции темы
CosmoMan
Дата 17.11.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: -1
Всего: 0



Есть XML файл наподобие такого:

Код

<?xml version="1.0" encoding="windows-1251"?>
<root>
    <tag name="Яблоки">
        <item>1</item>
        <item>10</item>
        <item>100</item>
        <item>1000</item>        
    </tag>
    <tag name="Груши">
        <item>2</item>
        <item>20</item>
        <item>200</item>
        <item>2000</item>
    </tag>
    <tag name="Сливы">
        <item>3</item>
        <item>30</item>
        <item>300</item>
        <item>3000</item>
    </tag>
</root>
 

Нужно считывать последовательно в cтруктуру или класс значения в item-ах. Работаю в Visual Studio 2005 или 2008.
Парсер tinyxml

Вот пример кода из примера для tinyxml:
Код

#include <iostream>
#ifdef TIXML_USE_STL
    #include <iostream>
    #include <sstream>
    using namespace std;
#else
    #include <stdio.h>
#endif

#if defined( WIN32 ) && defined( TUNE )
    #include <crtdbg.h>
    _CrtMemState startMemState;
    _CrtMemState endMemState;
#endif

#include "tinyxml.h"

int main()
{
TiXmlDocument xml("test.xml");
xml.LoadFile();
xml.Print(); //выводит весь файл

xml.RootElement()->Print(  stdout, 1 ); //печатается весь <root>...
xml.RootElement()->FirstChild()->Print(  stdout, 1 ); //печатается <tag name="Яблоки">...

TiXmlNode* node(xml.RootElement()->FirstChild()->NextSibling()); //запись получила значение структуры "Груши"
node->Print( stdout, 1 ); //печатается <tag name="Груши">...

}


Как теперь можно получить строку name и значение каждого item-ма ?

Пожалуйста, помогите решить эту проблему.
 
PM MAIL   Вверх
jonie
Дата 17.11.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



почитайте доку к парсеру.

а я б на вашем месте делал не так, а..
1) сделать xsd схему для xml-ки
2) натравить на эту схему вот этот парсер http://www.codesynthesis.com/products/xsd/
3)он выдаст на выходе либо DOM либо SAX типизированный класс, базой для которого будет Xerces C++ (по умолчанию).

а далее весь парсинг будет заключаться в работе с "массивом"...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
CosmoMan
Дата 17.11.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: -1
Всего: 0



Цитата

почитайте доку к парсеру.

Так и сделал с утра, на свежую голову во всём разобрался. 
Парсер работает нормально. 

Цитата

а я б на вашем месте делал не так, а..
1) сделать xsd схему для xml-ки
2) натравить на эту схему вот этот парсер http://www.codesynthesis.com/products/xsd/
3)он выдаст на выходе либо DOM либо SAX типизированный класс, базой для которого будет Xerces C++ (по умолчанию).

а далее весь парсинг будет заключаться в работе с "массивом"...


Интересно. Это действительно удобно. Попробую. Спасибо. 

У меня сей час такая проблема. 
Парсер значения считывает не в юникаде, а в ASCII и, как следсвтвие, русский в виду кркозябин.
Тот парсер, что вы рекомендуете, позволяет работать с wchar_t ?
PM MAIL   Вверх
Static
Дата 17.11.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: 1
Всего: 2



Цитата

<?xml version="1.0" encoding="windows-1251"?>

Это ведь из Вашего файла? TinyXML умеет читать в юникоде, но для этого нужен юникодный xml-файл.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
CosmoMan
Дата 17.11.2009, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: -1
Всего: 0



Цитата

Цитата

<?xml version="1.0" encoding="windows-1251"?>

Это ведь из Вашего файла? TinyXML умеет читать в юникоде, но для этого нужен юникодный xml-файл.


Да, но это я сам написал, что кодировка windows-1251. А как сделать xml-файл юникодным? 
Мне казалось, что он уже изначально юникодный, главное указать кодировку. 
PM MAIL   Вверх
Static
Дата 18.11.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 6.11.2008

Репутация: 1
Всего: 2



CosmoMan
Ну в каком-нить текстовом редакторе, типа Notepad++ можно конвертнуть файл в нужную кодировку. И потом написать в начале:
Код

<?xml version="1.0" encoding="UTF-8"?>

например. Кажется, кстати, что TinyXml ругается, если не совпадает кодировка с тем, что написано в начале файла.
--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.