Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работа с XML в C++


Автор: CosmoMan 17.11.2009, 00:43
Есть 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-ма ?

Пожалуйста, помогите решить эту проблему.
 

Автор: jonie 17.11.2009, 01:56
почитайте доку к парсеру.

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

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

Автор: CosmoMan 17.11.2009, 11:51
Цитата

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

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

Цитата

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

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


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

У меня сей час такая проблема. 
Парсер значения считывает не в юникаде, а в ASCII и, как следсвтвие, русский в виду кркозябин.
Тот парсер, что вы рекомендуете, позволяет работать с wchar_t ?

Автор: Static 17.11.2009, 12:25
Цитата

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

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

Автор: CosmoMan 17.11.2009, 19:49
Цитата

Цитата

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

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


Да, но это я сам написал, что кодировка windows-1251. А как сделать xml-файл юникодным? 
Мне казалось, что он уже изначально юникодный, главное указать кодировку. 

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

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

например. Кажется, кстати, что TinyXml ругается, если не совпадает кодировка с тем, что написано в начале файла.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)