1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

XML Schnittstelle auf Webseite auslesen

Discussion in 'Programmieren' started by VB-Coder, Oct 19, 2009.

Thread Status:
Not open for further replies.
  1. VB-Coder

    VB-Coder Megabyte

    Hi,

    Erstmal vorweg: Mir ist kein besseres Topic für das ganze eingefallen.

    Worum geht es ?!

    Es geht darum das ich eine Möglichkeit suche ein Programm zu erstellen, womit ich eine XML Schnittstelle auf einer Webseite auslesen kann.

    Das Programm soll einmal als selbstständig Dialogbasierendes Programm, welches die benötigten Daten aus einer Textbox des Dialoges bekommt und einmal als Konsolenanwendung, die die benötigten Daten per Parameter bekommt erstellt werden.

    Das Dialogbasierende Programm könnte ich in VB6 mittels Webbrowser-Control erstellen. Sollte also nicht das größte Problem darstellen.



    Was mich vor Probleme stellt ist die Konsolenanwendung. Da ich nicht den Ansatz einer Idee habe, wie ich das ganze realisieren soll.

    Kommen wir aber erstmal zum Aufbau des Weblinks und der auszulesenden Seite.

    Der Link ist wie folgt aufgebaut
    Der Quelltext der Resultateseite sieht dann wie folgt aus
    Wie soll das ganze jetzt funktionieren ?
    ich schreibe am cmd : c:\>dateiname.exe testwert123

    Das Programm öffnet dann die entsprechende Seite mit dem übergebenen Parameter.

    Also so:
    Jetzt liest sie den Inhalt und schreibt mir den in eine Textdatei, die letztendlich den Namen des übergebenen Wertes hat. Also testwert123.txt


    Kann mir jemand sagen wie ich das realisieren kann ? Ggf. Mit einem Beispielcode. Wenn möglich in C++ oder Autoit. Denn in VB6 wäre das zwar auch möglich, aber ich möchte das die Konsolenanwendung als einfache exe portabel ist. Sprich also ohne weiteres auf jedem Windows PC funktioniert. Bedenkt aber bitte ich bin weder in C++ noch in Autoit eine Leuchte. ;)

    Danke für eure Hilfe
     
  2. kazhar

    kazhar Viertel Gigabyte

    geht es dir um den netzwerkcode?
    also einfach nur den server kontaktieren, die url abrufen und das ergebnis abspeichern?
     
  3. VB-Coder

    VB-Coder Megabyte

    Ja es geht lediglich darum
    Server mit übergabe der Parameter aufrufen
    Inhalt abfragen und in txt Datei speichern.
     
  4. kazhar

    kazhar Viertel Gigabyte

    winsock kann das.

    erstmal mit WSAStartup das netzwerk initialisieren,
    dann mit socket(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP) einen tcp socket erzeugen,
    mit getHostByName die IP des servers auflösen (xml.meineSeite.de <- kein http:// vorher und kein /irgendwas nacher!) und
    mit connect den socket mit dem server verbinden.

    dann die anfrage als string mit send an den server schicken:
    GET /?query=übergebener_Wert HTTP/1.1 [crlf]
    Host: xml.meineSeite.de [crlf]
    User-Agent: mein xml-abfrage-programm v1.0 [crlf]
    Accept: text/xml [crlf]
    Accept-Charset: ISO-8859-15,utf-8 [crlf]
    Connection: close [crlf]
    [crlf]

    statt dem [crlf] musst du die ascii zeichen #13 und #10 (also ein "dos-enter") schicken. am besten alles in einen buffer schreiben und dann als block schicken-

    der server antwortet dann und schickt erst einen http-header und dann die datei. der header ist (wie bei der anfrage) durch ein doppeltes [crlf] abgeschlossen.
    das lesen aus dem socket funktioniert mit recv.

    edit: man sollte auch darauf achten, dass netzwerkübertragungen grundsätzlich paketweise erfolgen. also kann die übertragung prinzipiell an jeder stelle "gestückelt" sein. der rest muss dann solange per recv angefordert werden, bis die verbindung unterbrochen wird.

    so richtig in c++ hab ich das nicht geschrieben. bin eher von der pascal/delphi fraktion.
     
    Last edited: Oct 19, 2009
  5. VB-Coder

    VB-Coder Megabyte

    ok das was du geschrieben hast, ist mir grundlegend klar - ist ja bei einer winsock verbindung im vb auch nicht viel anders.

    nur wie ich schon geschrieben habe bin ich in c++ keine leuchte.
    aber ich werd mal versuchen ob ich das via google und nen paar tutorials irgendwie auf die reihe bekomme.

    eine grundlegende frage hab ich da aber noch
    wie stelle ich es an die variable, die ich später übergebe am cmd in den code zur verarbeitung zu holen. hoffe ich hab mich verständlich ausgedrückt, denn google versteht mich nicht btw. ich finde irgendwie nicht das was ich suche ;)
     
  6. kazhar

    kazhar Viertel Gigabyte

    unter "standard c" kriegst du die kommandozeile ganz einfach über die parameter, die der main übergeben werden. als beispiel:

    Code:
    #include <stdio.h>
    int main( int argc, const char* argv[] )
    {
         int i;
         for(i = 0; i < argc; i++ )
         {
              printf( "arg %d: %s\n", i, argv[i] );
         }
    }
    
    ich finde die beispiele im msdn recht gut lesbar.
    beispiel "connect"
    Code:
    #include <stdio.h>
    #include "winsock2.h"
    #include <windows.h>
    #pragma comment(lib, "wininet.lib")
    
    void main() {
      //----------------------
      // Initialize Winsock
      WSADATA wsaData;
      int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
      if (iResult != NO_ERROR)
        printf("Error at WSAStartup()\n");
    
      //----------------------
      // Create a SOCKET for connecting to server
      SOCKET ConnectSocket;
      ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return;
      }
    
      //----------------------
      // The sockaddr_in structure specifies the address family,
      // IP address, and port of the server to be connected to.
      sockaddr_in clientService; 
      clientService.sin_family = AF_INET;
      clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
      clientService.sin_port = htons( 27015 );
    
      //----------------------
      // Connect to server.
      if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return;
      }
    
      printf("Connected to server.\n");
      WSACleanup();
      return;
    }
     
  7. VB-Coder

    VB-Coder Megabyte

    Okay erstmal Danke - ich werd mein Glück versuchen und mich dann mit Sicherheit mit Fehlermeldungen und Fragen wieder hier melden ;)
     
  8. VB-Coder

    VB-Coder Megabyte

    Ok ich stehe jetzt mal dazu - ich bin zu bl&#246;d !

    Wenn ich ganz nett anfrage (und ja es ist mir bewusst das man sowas eigentlich nicht macht), w&#252;rde mir dann jemand so einen Code in C++ erstellen ? Sodass ich letztendlich nurnoch die Webseite eintragen muss in den Quellcode und das Programm sich dann den entsprechenden Quelltext von der Homepage zieht.

    Sprich also wenn das Programm fertig ist, gehe ich an den cmd, starte das Programm mit einen Parameter, der an das Programm &#252;bergeben wird und das Programm &#246;ffnet dann die webseite in dem Format http://xml.meineseite.de/?query=Wert

    Wobei Wert immer der Parameter ist den ich am cmd &#252;bergebe.
    Dann holt sich das Programm den Quelltext der Seite und speichert ihn mir im selben Verzeichnis wie die exe als Textdatei.

    Edit: Doppelpost, weil editieren nicht mehr m&#246;glich war.
     
  9. kalweit

    kalweit Hüter der Glaskugel

    Warum nimmst du nicht einfach wget, das macht genau das?
     
  10. VB-Coder

    VB-Coder Megabyte

    Wget nehme ich nicht weil

    a) ich nicht will, das die vom Programm aufgerufene URL für den Benutzer sichtbar/bekannt ist

    und ich somit

    b) den Source von wget den ich erst recht nicht überblicke dann so abändern müsste, das a) erfüllt wird.

    Sprich ich brauch ein Programm was genau das macht was ich schon beschrieben habe, wo man als Benutzer aber nurnoch den entsprechenden Parameter ohne Eingabe der URL übergeben muss.
     
  11. kazhar

    kazhar Viertel Gigabyte

    soll a) ein sicherheits feature oder nur bequemlichkeit sein? :D

    soll das programm von einem script aufgerufen werden? was passiert sp&#228;ter mit der .xml?
     
  12. VB-Coder

    VB-Coder Megabyte

    a) soll ein annäherndes Sicherheitsfeature sein - aber es soll auch "deppen" freundlich sein.
    das programm wird später per hand vom user am cmd aufgerufen
    sprich der user geht an den cmd gibt dort ein: programm.exe parameter
    der rest passiert automatisch

    die textdatei also der inhalt aus der xml wird bei Bedarf weiter verarbeitet. deshalb soll die textdatei ja den namen des übergebenen parameters tragen.
     
  13. kazhar

    kazhar Viertel Gigabyte

    wenn es ohnehin nicht &#252;ber script laufen soll warum dann die parameter geschichte? draufklicken, den wert in eine edit box eingeben und ok klicken liegt dem 08/15 mausschubbser n&#228;her. (und nein, daf&#252;r braucht man nix installieren)

    w&#252;rde es eventuell auch ein wrapper f&#252;r wget tun? musst dann halt damit leben, dass entweder wget mit dem programm mitgegeben werden muss oder es kurzzeitig in "temp" auftaucht (wenns als ressource mitkompliert wird)
     
    Last edited: Oct 20, 2009
  14. VB-Coder

    VB-Coder Megabyte

    Warum die Parameter Geschichte ?

    Ganz einfach weil das Programm damit flexibel bleibt und mir im Nachhinein auch noch erm&#246;glicht die Parameter von einer anderen Anwendung aus zu &#252;bergeben.

    Sprich ich Arbeite z.B. in Excel und habe in Excel einen Parameter drin den ich ausgelesen haben m&#246;chte, dann k&#246;nnte man nachtr&#228;glich eine Funktion schreiben die den Parameter automatisch aus Excel an das Programm &#252;bergibt.

    zukunftsorientiert gedacht.

    Edit: Wie das ganze gel&#246;st werden k&#246;nnte davon habe ich keine Ahnung (wie schon geschrieben). Ich habe lediglich die Vorstellung wie es laufen soll und die Anforderung an das ganze das es m&#246;glichst als eigenst&#228;ndige EXE Datei auf jedem Windows PC laufen sollte.
     
    Last edited: Oct 20, 2009
  15. kazhar

    kazhar Viertel Gigabyte

    ich hab das ganze mal in pascal geschrieben. tut soweit ich das testen kann seinen job und sollte z.b. in freepascal kompilieren (wenn man den compilermode auf delphi setzt und den elenden range-check abschaltet)

    kannst ja mal dr&#252;bersehen, ob es dir hilft.
     
  16. VB-Coder

    VB-Coder Megabyte

    Perfekt ! Dankeschön.
    Wie kann ich das bloß wieder gut machen ? :rolleyes:
     
Thread Status:
Not open for further replies.

Share This Page