xml-Datei durchsuchen und ggf. mehrere Zeilen löschen



  • Mein Problem ist nun wenn ich das Programm laufen lasse, ist zwar eine neue korrekte xml datei erstellt worden. Also korrekt vom Inhalt. Die Datei wurde im ANSI-Format abgespeichert und deshalb sagt mir z.B. der IE einen Fehler beim Aufruf der Datei. Wenn ich Notepad öffne und in der UTF-8 Codierung abspeicher, und anschließend die Datei aufrufe, stellt sie der IE ohne Fehler korrekt da.

    Für Leute die es mal gebrauchen können:
    z.B. Aufruf des Programmes in der Eingabeaufforderung

    euerprogrammname.exe eure_zu_durchsuchende_datei.xml "begin" "ende"

    int main(int argc, char* argv[])
    {
      ifstream datei;
      ofstream neuedatei;
      string zeile;
    
      datei.open(argv[1], ios::in);
      neuedatei.open("temp.xml", ios::in);
    
      bool gefunden = false;
    
      while(!datei.eof())
      {
        getline(datei,zeile);
        if(zeile.find(argv[2])!=string::npos) 
          gefunden = true;
        if(!gefunden)
          neuedatei << zeile << endl;
        if(zeile.find(argv[3]) !=string::npos) 
          gefunden = false;
      }
    
      datei.close();
      neuedatei.close();
      remove(argv[1]);
      rename("temp.xml", argv[1]);
      return 0;
    }
    


  • Also den Fehler mußt du nochmal genauer erklären. Was für einen Fehler meldet der IE?

    hustle1 schrieb:

    neuedatei.open("temp.xml", ios::in);

    Sollte die Ausgabedatei nicht besser im Modus ios::out geöffnet werden?



  • Selbstverständlich mit "ios:out"
    habe es nur abgesprieben gehabt, da ich auf nem privaten laptop das programm geschrieben habe, aber nur an einem anderen rechner i net habe.
    deswegen der fehler beim abschreiben.
    kann leider nicht als hustle1 editieren.

    Fehler im IE:

    Die XML-Seite kann nicht angezeigt werden
    Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet XSL verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.

    --------------------------------------------------------------------------------

    Ungültig auf der obersten Ebene im Dokument. Fehler beim Bearbeiten der Ressource 'file:///C:/Downloads/Programm/Filters.xm...

    </Filters>

    Kaputte Datei http://home.arcor.de/hustle.on.1/Filters.xml
    Die Datei enthält nach dem Löschen mit meinem Programm komische Zeichen. Mit nem Editor siehste die.

    Wenn ich eine xml Datei, die sich im IE öffnen lässt, anschließend im Notepad öffne und mit der ANSI Codierung abspeichere, lässt sie sich trotzdem noch öffnen. Also es liegt es dann anscheinend nicht an der Codierung ANSI/UTF-8, sondern an diesen Zeichen (Return ?)



  • *Push* *Push*

    Jemand eine Ahnung zu meinem oben genannten Problem ?

    CStoll ?



  • hustle schrieb:

    *Push* *Push*

    Jemand eine Ahnung zu meinem oben genannten Problem ?

    CStoll ?

    *Push*



  • hustle schrieb:

    Jemand eine Ahnung zu meinem oben genannten Problem ?

    CStoll ?

    Sorry, hier muß ich passen - mit C++ kenne ich mich aus, aber dein Problem scheint XML zu betreffen und das ist nicht mein Fall.



  • CStoll schrieb:

    hustle schrieb:

    Jemand eine Ahnung zu meinem oben genannten Problem ?

    CStoll ?

    Sorry, hier muß ich passen - mit C++ kenne ich mich aus, aber dein Problem scheint XML zu betreffen und das ist nicht mein Fall.

    Ich habe nun aber wieder ein C++ Problem nachdem ich das XML Problem gelöst habe.
    Lösung: Anstatt Borland Builder 5 den 6er genommen.
    Ich weiß nicht warum es mit dem 6er geht !! Habe exakt den gleichen Code verwendet !!!
    So nun zu meinem problem:

    wenn ich mein programm aufrufe. und ihm einen xml-tag (Parameter 2) mitgebe, der so aussieht:

    <config mode="hallo">

    dann verändert er mir meine datei nicht. Sie ist aber weiterhin okay.
    Der Parameter 3 wäre dann z.b. dieser:

    </config>

    Ich weiß auch woran das Problem liegt und zwar, überall da wo in meinem Code auf diesen zweiten Parameter zugegriffen wird mit "argv[2]" wird aus

    <config mode="hallo"> ----> <config mode=>

    Also er schließt, dass was innerhalb meiner Gänßefüßchen ist aus. Der Tag "<config mode=>" wird natürlich nicht in meiner übergebenen XML-Datei gefunden.

    #include <iostream.h>
    #include <fstream>
    #include <conio.h>
    using namespace std;
    
    void main(int argc, char* argv[])
    {
      ifstream datei, temp;
      ofstream neuedatei;
      string zeile, parameter, zeilenanzahlstring;
      int pos1, pos2, abstand, parameterlaenge;
    
      if(argc == 4)
      {
    
        datei.open(argv[1], ios::in);
        neuedatei.open("temp.xml", ios::out);
    
        while(getline(datei, zeilenanzahlstring))
          neuedatei << zeilenanzahlstring;
    
        datei.close();
        neuedatei.close();
        remove(argv[1]);
        rename("temp.xml", argv[1]);
    
        temp.open(argv[1], ios::in);
        neuedatei.open("temp.xml", ios::out);
    
        parameter = argv[3];
        parameterlaenge = parameter.length();
    
        getline(temp,zeile);
        while(zeile.find(argv[2]) != string::npos)
        {
          pos1 = zeile.find(argv[2]);
          pos2 = zeile.find(argv[3]);
          pos2 += parameterlaenge;
          abstand = pos2-pos1;
          zeile.erase(pos1, abstand);
        }
        neuedatei << zeile;
    
        temp.close();
        neuedatei.close();
    
        remove(argv[1]); 
        rename("temp.xml", argv[1]);
      }
    }
    

    Das doppelte Öffnen, Schließen, Löschen und Umbennen passiert aus folgendem Grund und zwar lösch ich beim ersten mal alle zeilenumbrüche und beim zweiten mal, also zugriff auf die datei per "getline()" hole ich mir nur eine Zeile aus der Datei. Hat in meinem Fall paar Probleme deshalb diese Lösung!!!



  • hustle schrieb:

    CStoll schrieb:

    hustle schrieb:

    Jemand eine Ahnung zu meinem oben genannten Problem ?

    CStoll ?

    Sorry, hier muß ich passen - mit C++ kenne ich mich aus, aber dein Problem scheint XML zu betreffen und das ist nicht mein Fall.

    Ich habe nun aber wieder ein C++ Problem nachdem ich das XML Problem gelöst habe.
    Lösung: Anstatt Borland Builder 5 den 6er genommen.
    Ich weiß nicht warum es mit dem 6er geht !! Habe exakt den gleichen Code verwendet !!!
    So nun zu meinem problem:

    wenn ich mein programm aufrufe. und ihm einen xml-tag (Parameter 2) mitgebe, der so aussieht:

    <config mode="hallo">

    dann verändert er mir meine datei nicht. Sie ist aber weiterhin okay.
    Der Parameter 3 wäre dann z.b. dieser:

    </config>

    Ich weiß auch woran das Problem liegt und zwar, überall da wo in meinem Code auf diesen zweiten Parameter zugegriffen wird mit "argv[2]" wird aus

    <config mode="hallo"> ----> <config mode=>

    Also er schließt, dass was innerhalb meiner Gänßefüßchen ist aus. Der Tag "<config mode=>" wird natürlich nicht in meiner übergebenen XML-Datei gefunden.

    #include <iostream.h>
    #include <fstream>
    #include <conio.h>
    using namespace std;
    
    void main(int argc, char* argv[])
    {
      ifstream datei, temp;
      ofstream neuedatei;
      string zeile, parameter, zeilenanzahlstring;
      int pos1, pos2, abstand, parameterlaenge;
    
      if(argc == 4)
      {
    
        datei.open(argv[1], ios::in);
        neuedatei.open("temp.xml", ios::out);
    
        while(getline(datei, zeilenanzahlstring))
          neuedatei << zeilenanzahlstring;
    
        datei.close();
        neuedatei.close();
        remove(argv[1]);
        rename("temp.xml", argv[1]);
    
        temp.open(argv[1], ios::in);
        neuedatei.open("temp.xml", ios::out);
    
        parameter = argv[3];
        parameterlaenge = parameter.length();
    
        getline(temp,zeile);
        while(zeile.find(argv[2]) != string::npos)
        {
          pos1 = zeile.find(argv[2]);
          pos2 = zeile.find(argv[3]);
          pos2 += parameterlaenge;
          abstand = pos2-pos1;
          zeile.erase(pos1, abstand);
        }
        neuedatei << zeile;
    
        temp.close();
        neuedatei.close();
    
        remove(argv[1]); 
        rename("temp.xml", argv[1]);
      }
    }
    

    Das doppelte Öffnen, Schließen, Löschen und Umbennen passiert aus folgendem Grund und zwar lösch ich beim ersten mal alle zeilenumbrüche und beim zweiten mal, also zugriff auf die datei per "getline()" hole ich mir nur eine Zeile aus der Datei. Hat in meinem Fall paar Probleme deshalb diese Lösung!!!

    *Push Push*

    Geht doch eigentlich im Prinzip nur, wie ich selbst Gänßefüßchen in einer Variablen abspeichere:

    AnsiString NamederVar = " Hallo" benjamin" ";
    Variablentyp ist in meinem Fall halt:

    char* argv[]

    Wenn es damit nicht geht, weiß vielleicht jemand eine Möglichkeit wie ich es hinbekomme, Parameter, die Gänßefüßchen enthalten zu übergeben und mit denen weiterzuarbeiten?



  • Naja, das liegt in diesem Fall nicht am Datentyp und generell nicht bei C++. Es ist eine Frage des Betriebssystems, mitunter auch der shell, wie sie Parameter übergibt bzw. wie es die Eingabe parst. Frag' mich aber bitte jetzt nich wie diese komische Windows/DOS Krücke "cmd.exe" (%ComSpec%, %SystemRoot%\system32\cmd.exe) das macht...

    Greetz, Swordfish

    *edit: to sophisticated*



  • einfach ein backslash vors Gänsefüßchen!
    Thread kann geclosed werden.

    Big Thx 4 Help @ all


Anmelden zum Antworten