PDA

Просмотр полной версии : c++ и xml


malik555
01.07.2009, 14:12
Всем привет !


Как можно разобрать xml в c++ под unix

например



char xml = "
<root>
<item>
<a>Helo !!!</a>
</item>
</root>
";



вытащить "Helo !!" ?

[n]-c0der
01.07.2009, 14:25
Вообще существует не мало либ, для работы с XML...
К примеру вот:
http://xerces.apache.org/index.html
http://www.chilkatsoft.com/xml-library.asp
CdataClass -> http://www.firstobject.com/dn_dataedit.htm
http://www.firstobject.com/dn_editor.htm - программка с исходным кодом, можно глянуть исходники

t4Nk
01.07.2009, 19:58
советую pugixml (http://code.google.com/p/pugixml/)

использовать так

#include <iostream>
#include "pugixml.hpp"

using namespace pugi;
using namespace std;

int main(int argc, char *argv[]) {

xml_document doc;

char xml[] = "<root><item><a>Hello world!</a></item></root>";
doc.load(xml);
xml_node item = doc.child("root").child("item").child("a");
cout << item.child_value(); // Hello world!

return 0;
}


удачи (:

malik555
01.07.2009, 21:25
советую pugixml (http://code.google.com/p/pugixml/)

использовать так

#include <iostream>
#include "pugixml.hpp"

using namespace pugi;
using namespace std;

int main(int argc, char *argv[]) {

xml_document doc;

char xml[] = "<root><item><a>Hello world!</a></item></root>";
doc.load(xml);
xml_node item = doc.child("root").child("item").child("a");
cout << item.child_value(); // Hello world!

return 0;
}


удачи (:


Спасибо !

Проблема такая скачал я эту штуку папку src/ кинул на сервер компелю

g++ xml.cpp -o xml

выдает



/var/tmp//ccS1gZxe.o(.text+0x1bf): In function `main':
: undefined reference to `pugi::xml_document::xml_document()'
/var/tmp//ccS1gZxe.o(.text+0x246): In function `main':
: undefined reference to `pugi::xml_document::load(char const*, unsigned int)'
/var/tmp//ccS1gZxe.o(.text+0x25f): In function `main':
: undefined reference to `pugi::xml_node::child(char const*) const'
/var/tmp//ccS1gZxe.o(.text+0x275): In function `main':
: undefined reference to `pugi::xml_node::child(char const*) const'
/var/tmp//ccS1gZxe.o(.text+0x28b): In function `main':
: undefined reference to `pugi::xml_node::child(char const*) const'
/var/tmp//ccS1gZxe.o(.text+0x299): In function `main':
: undefined reference to `pugi::xml_node::child_value() const'
/var/tmp//ccS1gZxe.o(.text+0x2bc): In function `main':
: undefined reference to `pugi::xml_document::~xml_document()'
/var/tmp//ccS1gZxe.o(.text+0x2de): In function `main':
: undefined reference to `pugi::xml_document::~xml_document()'



что это может быть ?

t4Nk
01.07.2009, 21:47
malik555, так ты компилмшь только xml.cpp, а надо еще и pugixml.cpp.
т.е. так g++ xml.cpp pugixml.cpp -o xml

да и #include "pugixml.hpp" - это в случае если этот файл лежит в одной папке с xml.cpp. Если у тебя в src, тогда нужно "/src/pugixml.cpp"

malik555
01.07.2009, 22:07
Спасиб все пашет !

только pugixml.cpp:25:29: warning: missing terminating ' character

что-то вылетает !


А если например нужно изминить "Helo !!!" в переменной xml



char xml[] = "<root><item><a>Hello !!!</a></item></root>";


что-б осталясь структура xml можно как-то ?

t4Nk
01.07.2009, 22:36
Не совсем понял тебя

char xml[] = "<root><item><a>Hello!!!</a></item></root>";
doc.load(xml);
xml_node item = doc.child("root").child("item").child("a").first_child();
cout << item.value() << endl; // Hello!!!
item.set_value("text");
cout << item.value() << endl; // text
doc.print(cout); /* выведет xml-код

<root>
<item>
<a>Goodbye!!!</a>
</item>
</root>
*/

там в архиве есть файл с примерами, можешь посмотреть там возможности либы )

malik555
01.07.2009, 23:03
Не совсем понял тебя

char xml[] = "<root><item><a>Hello!!!</a></item></root>";
doc.load(xml);
xml_node item = doc.child("root").child("item").child("a").first_child();
cout << item.value() << endl; // Hello!!!
item.set_value("text");
cout << item.value() << endl; // text
doc.print(cout); /* выведет xml-код

<root>
<item>
<a>Goodbye!!!</a>
</item>
</root>
*/

там в архиве есть файл с примерами, можешь посмотреть там возможности либы )


То что нужно !

Спасибо ! классная либа - работать одно удовольствие !

Хотел тебе +1 добавить - но что-то не получается (наверное у меня репа 0) поэтому не выходит !

malik555
02.07.2009, 01:12
#include <iostream>
#include "lib/xml/pugixml.hpp"





using namespace pugi;
using namespace std;

int main() {



xml_document doc;

char xml[] = "<root><item><a>1111</a><b>2222</b></item></root>";
doc.load(xml);

xml_node item = doc.child("root").child("item").child("b").first_child();


string d = item.value();
/*
* получается данные я могу считать только в
* переменную с типом string !
* А мне дальше нужно эту переменую "d" умножить / разделить
* как ее можно из string в int ?
*
*/


/*
* А записать ответ назад в xml можно только char
* получается ее еше нужно и в char переводить
*
* Как правельно сделать ?
*
*/

item.set_value(d);
doc.print(cout);


return 0;

}

t4Nk
02.07.2009, 01:31
как-то так

char *d = (char *)item.value();

int c = atoi(d);
char str[16];
itoa(c, str, 10);

item.set_value(str);

malik555
02.07.2009, 01:49
как-то так

char *d = (char *)item.value();

int c = atoi(d);
char str[16];
itoa(c, str, 10);

item.set_value(str);



У меня itoa(); вобще не хочет работать

Заголовочные файлы

#include<stdlib.h>

выдает

'itoa' was not declared in this scope

t4Nk
02.07.2009, 02:41
тогда так sprintf(str, "%d", c);

malik555
18.08.2009, 22:26
malik555, так ты компилмшь только xml.cpp, а надо еще и pugixml.cpp.
т.е. так g++ xml.cpp pugixml.cpp -o xml

да и #include "pugixml.hpp" - это в случае если этот файл лежит в одной папке с xml.cpp. Если у тебя в src, тогда нужно "/src/pugixml.cpp"


В linux все компилится - а как в visual C++ добавить этот файл в проэкт pugixml.cpp ???

t4Nk
18.08.2009, 23:36
В linux все компилится - а как в visual C++ добавить этот файл в проэкт pugixml.cpp ???
открываешь Solution Explorer (Ctrl + Alt + L) и перетягиваешь в Source Files файл pugixml.cpp. И всё )

malik555
18.08.2009, 23:58
открываешь Solution Explorer (Ctrl + Alt + L) и перетягиваешь в Source Files файл pugixml.cpp. И всё )

Что то у меня не получается

Я в программе visual c++ нажимаю Ctrl + Alt + L нечего не происходит !

t4Nk
19.08.2009, 00:34
это для visual studio 2008.
По сути во всех версиях есть список файлов проекта. Посмотри в меню View->Solution Explorer.

malik555
19.08.2009, 00:56
это для visual studio 2008.
По сути во всех версиях есть список файлов проекта. Посмотри в меню View->Solution Explorer.

Спасибо !

У меня visual c++ 6 я так и не нашел Solution Explorer - тут по другому сделал вобщем работает !