c++ и xml

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by malik555, 1 Jul 2009.

  1. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0
    Всем привет !


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

    например

    Code:
    
    char  xml =  "
                        <root>
                            <item>
                              <a>Helo !!!</a>
                            </item>
                        </root>
                         ";
    
    
    вытащить "Helo !!" ?
     
  2. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    24
    Reputations:
    -1
    Вообще существует не мало либ, для работы с 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 - программка с исходным кодом, можно глянуть исходники
     
  3. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    советую pugixml

    использовать так
    Code:
    #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;
    }
    
    удачи :)
     
  4. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0

    Спасибо !

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

    g++ xml.cpp -o xml

    выдает

    Code:
    
    /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()'
    
    
    что это может быть ?
     
  5. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    malik555, так ты компилмшь только xml.cpp, а надо еще и pugixml.cpp.
    т.е. так g++ xml.cpp pugixml.cpp -o xml

    да и #include "pugixml.hpp" - это в случае если этот файл лежит в одной папке с xml.cpp. Если у тебя в src, тогда нужно "/src/pugixml.cpp"
     
    #5 t4Nk, 1 Jul 2009
    Last edited: 1 Jul 2009
  6. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0
    Спасиб все пашет !

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

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


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

    Code:
    
    char xml[] = "<root><item><a>Hello !!!</a></item></root>";
    
    что-б осталясь структура xml можно как-то ?
     
  7. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    Не совсем понял тебя
    Code:
    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 person likes this.
  8. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0

    То что нужно !

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

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

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0
    Code:
    
    #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;
        
    }
    
    
     
  10. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    как-то так
    Code:
    char *d = (char *)item.value();
    
    int c = atoi(d);
    char str[16];
    itoa(c, str, 10);
    
    item.set_value(str);
    
     
  11. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0

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

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

    #include<stdlib.h>

    выдает

    'itoa' was not declared in this scope
     
  12. t4Nk

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    тогда так sprintf(str, "%d", c);
     
  13. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0

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

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    открываешь Solution Explorer (Ctrl + Alt + L) и перетягиваешь в Source Files файл pugixml.cpp. И всё )
     
  15. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0
    Что то у меня не получается

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

    t4Nk Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    70
    Likes Received:
    33
    Reputations:
    0
    это для visual studio 2008.
    По сути во всех версиях есть список файлов проекта. Посмотри в меню View->Solution Explorer.
     
  17. malik555

    malik555 New Member

    Joined:
    4 Feb 2009
    Messages:
    132
    Likes Received:
    1
    Reputations:
    0
    Спасибо !

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