madlen611 Temat założony przez niniejszego użytkownika |
pobieranie zadań z systemu » 2014-05-19 21:21:18 Witam. Mam projekt z którym muszę napisać program, który ma pobrać dane z systemu np. Redmine, zakładka zagadnienia, gdzie tworzy w bieżącym katalogu pliki csv zawierające dane pobrane ze strony. Jeden plik csv odpowiada jednej kategorii zagadnień i każdy plik csv zawiera wszystkie zagadnienia z danej kategorii. Każdy plik csv zawiera następujące kolumny:id zadania, status (np. "new".),tytuł zadania, priorytet oraz affected version.Wewnątrz pliku CSV zadania są posortowane według priorytetów i statusów.
To, co na razie mam:
#include<iostream> #include<string> #include<fstream> #include<sstream> using namespace std; int main()
{ CURL *curl; CURLcode res; string str;
curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://www.redmine.org/projects/redmine/issues"); res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, str.c_str()); if(res == CURLE_OK) { cout << "pobrano dane\n\n"; cout << str; cout <<"\n\n"; system("pause"); system("cls"); } res = curl_easy_perform(curl); curl_easy_cleanup(curl); }
cout <<"\n\n"; system("pause"); system("cls");
string s ("html"); size_t found; found = str.find(s);
cout << "znalezione: " << int(found) << endl;
system("pause"); return 0; }
czy to jest dobrze napisane, czy mogę prosić o jakąś podpowiedź jak najlepiej i najszybciej napisać brakujący kod? |
|
MrPoxipol |
» 2014-05-19 21:25:33 |
|
madlen611 Temat założony przez niniejszego użytkownika |
odp » 2014-05-19 21:57:01 ok, czyli...ten kod, który napisałam jest dobrze, tylko zamiast http://www.redmine.org/projects/redmine/issues mam napisać http://www.redmine.org/projects/redmine/issues.xml, by mi to pobrało w c++, tak? Wiem, że zawartość pliku wyjściowego ma być #;Status;Temat;Priorytet;Affected version i jak mogę to dodać do kodu jako request? |
|
MrPoxipol |
» 2014-05-19 22:01:19 tylko zamiast http://www.redmine.org/projects/redmine/issues mam napisać http://www.redmine.org/projects/redmine/issues.xml, by mi to pobrało w c++, tak? |
Dostaniesz XMLa, którego musisz sparsować, a potem wygenerować tabelę CSV. |
|
madlen611 Temat założony przez niniejszego użytkownika |
odp » 2014-05-19 23:10:11 ok, dodałam biblioteke i sparsowałam xml. Zmieniłam też trochę kod. Czy ten jest napisany dobrze? Mam jeszcze problem z wygenerowaniem tableli CSR żeby to było napisane jakoś w tym stylu:
16905;New;Admin : groups otpimization of users count;Normal;""
16904;New;Add anonymous user to author list in issue query;Normal;""
16896;New;Follows Relation Ignored When Adding a Parent;Normal;2.5.1
16895;New;Can't verify CSRF token authenticity on IE9 with Alias;Normal;2.5.1
16888;New;Search fails for issues with identical created_on timestamp;Normal;2.5.1
16887;New;details_to_strings : reloads custom fields many times;Normal;2.5.1
a tutaj kod:
#include <iomanip> #include <iostream> #include <memory> #include <string> #include <curl/curl.h> #include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_print.hpp" #include "rapidxml/rapidxml_utils.hpp"
using namespace std; using namespace rapidxml;
static string buffer;
inline static int string_writer( #;Status;Temat;Priorytet;Affected version ) { int result = 0; if( buffer != NULL ) { buffer->append( chat* #;Status;Temat;Priorytet;Affected version ); result = ; } return result; }
inline static char * pobierzStrone( char * strona ) { bool byl_problem = false; do { buffer.reserve( 10000 ); buffer.clear(); CURL * curl; CURLcode result; curl = curl_easy_init(); if( curl ) { curl_easy_setopt( curl, CURLOPT_URL, strona ); curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, string_writer ); curl_easy_setopt( curl, CURLOPT_WRITEDATA, & buffer ); result = curl_easy_perform( curl ); if( result == CURLE_OK ) byl_problem = false; else { cout << "!Wystapil blad podczas pobierania strony, powtarzam czynnosc!\n"; byl_problem = true; } curl_easy_cleanup( curl ); } } while( byl_problem ); }
main() { char issues_redmine[] = "http://www.redmine.org/projects/redmine/issues.xml"; auto_ptr < char > tresc_strony( pobierzStrone( issues_redmine ) ); xml_document <> dokument; try { dokument.parse < 0 >( tresc_strony.get() ); } catch( parse_error p ) { p.what(); } dokument.clear(); }
Może być tutaj trochę błędów, ale i tak jest lepiej napisany niż wcześniej :) |
|
MrPoxipol |
» 2014-05-19 23:49:23 Ze sparsowanego XMLa musisz wyciągnąć interesujące Cię elementy. Najlepiej byłoby utworzyć klasę Zadania i przyporządkować do pól jej obiektów (przetrzymywanych np w vectorze) dane ze XMLa, tzn: musisz iterować po wszystkich zadaniach i potrzebne opcje zapisywać do obiektu. Mając taką tablicę przechodzisz do tworzenia tabeli CSV (to jest logiczne i proste, więc nie będę opisywał, bo wyszedłby z tego gotowiec ;>). Przed zapisaniem do pliku możesz jeszcze posortować przy użyciu jakiejś biblioteki do CSV.
A i kod na forum wstawiamy przy pomocy znaczników [cpp][/cpp] |
|
« 1 » |