Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

pobieranie zadań z systemu

Ostatnio zmodyfikowano 2014-05-19 23:49
Autor Wiadomość
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?
P-110433
MrPoxipol
» 2014-05-19 21:25:33
Nie musisz czasem .xml'a pobierać? (http://www.redmine.org​/projects/redmine/issues.xml, http://www.redmine.org​/projects/redmine/wiki​/Rest_Issues)
Ogólnie API jest całkiem spoko http://www.redmine.org​/projects/redmine/wiki/Rest_api.

Parser do XMLa, biblioteka do CSV (albo bez), API ze strony + requesty i jedziesz.
P-110434
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?
P-110435
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.
P-110437
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 :)
P-110440
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]
P-110442
« 1 »
  Strona 1 z 1