String Case-Sensetive MSXML6 Problem



  • M@tt schrieb:

    "tuuuut fatal error". ja und warum? weil ich zwar nen string gefunden habe....
    ich den ja aber auf klein verändert habe und somit nicht mit dem im originalen; so wie er in der xml steht; übereinstimmt.
    also totaler schwachsinn.

    Nicht ganz Schwachsinn. Hast ja noch den Index in der XML-Datei und kannst das "Original" wieder einlesen.



  • Merk dir dann doch eben einfach, zu welchen string der tolowerte string gehört. Kannst sie ja zusammen in eine Datenstruktur packen.

    Oder du machst es so, wie du es haben willst und gehst für den eingegeben string alle Möglichkeiten von Groß- und Kleinschreibung durch ( *mein Rechnet pfeift* ) und vergleichst es mit dem string aus der XML.



  • KasF schrieb:

    Oder du machst es so, wie du es haben willst und gehst für den eingegeben string alle Möglichkeiten von Groß- und Kleinschreibung durch ( *mein Rechnet pfeift* ) und vergleichst es mit dem string aus der XML.

    yap so nen algo hab ich ja von anfang an gesucht....

    aber wie auch immer. ich die andere methode ist zwar weitaus umständlicher, aber probieren werd ichs trotzdem mal. da hab ich aber schon das nächste prob. also angenommen ich habe den lower-string in ner variablen s1 und das original in s2. dann könnt ich zwar über s1.find("hallo",0) herausfinden, ob mein string drin ist, aber wie finde ich sie position? weiß da jemand wie man das über die string klasse machen kann.... oder muss ich das dann erst in char * konvertieren und da dann jedes zeichen prüfen?



  • aber wie auch immer. mal angenommen ich mache es jetzt so wie du es gesagt hast. ich lese die datei aus, pack das in nen string und mach alles klein. dann weiß ich ja -> mein gesuchter string(bsp.: "HalLo") , der ja nun klein ist ("hallo"), stimmt mit dem, den ich gesucht habe ("hallo") überein. es gibt ihn also. wenn ich dann aber mit meiner funktion den string in der xml datei markieren will, sagt er plötzlich "tuuuut fatal error". ja und warum? weil ich zwar nen string gefunden habe.... ich den ja aber auf klein verändert habe und somit nicht mit dem im originalen; so wie er in der xml steht; übereinstimmt. also totaler schwachsinn. wie ich aber bereits gesagt hatte.

    und da ist es besser, bei einem string wo man nicht weis wo er ist, alle case versionen einzeln durchzugehen, und dann zu suchen? An der stelle wo du deinen komischen casewirrwar machen willst, setzte stattdessen ne funktion hin, die zuerst den string kopiert, in kleinbuchstaben umwandelt, und dann vergleicht. dann hast du noch deinen originalstring und gleichzeitig das wissen, dass es der gesuchte ist(übrigens das, was ich schon ganz am anfang vorgeschlagen hab, aber scheinbar zählen nur bis zum fertigen code ausgearbeitete endlösungen zu nicht genau gestellten problemen).

    std::string eingabe;
    cin>>eingabe;
    ...
    std::string str=objDOMDoc->selectSingleNode("string")->text;
    if(istGleich(eingabe,str))
    {
        markiere
    }
    

    na den grund würde ich gern mal wissen... denn ich finde es total hohl. würde es nämlich diese funktion geben, wie in jedem anderen normalen forum, hätte ich erstmal jemanden im forum gefragt, der msxml spezialist ist, bevor ich ich den thread angefangen hätte.

    eben aus genau diesem grund. dann wären marcus, sidewinder und co erstmal den ganzen tag mit pm beantworten beschäftigt, und dann jeweils 100 pms von 10 verschiedenen leuten zum gleichen Thema, weil dann niemand mehr mitlesen kann und alle dieselben Fragen haben. Ist schon gut so, wie es ist. Und zuguter letzt gibt es noch den irc channel, wo man das wesentlich besser machen kann.

    und zu find: der rückgabewert ist aus gutem grund kein bool...warum wohl...
    http://www.cppreference.com/cppstring/find.html



  • otze schrieb:

    und da ist es besser, bei einem string wo man nicht weis wo er ist, alle case versionen einzeln durchzugehen, und dann zu suchen? An der stelle wo du deinen komischen casewirrwar machen willst, setzte stattdessen ne funktion hin, die zuerst den string kopiert, in kleinbuchstaben umwandelt, und dann vergleicht. dann hast du noch deinen originalstring und gleichzeitig das wissen, dass es der gesuchte ist(übrigens das, was ich schon ganz am anfang vorgeschlagen hab, aber scheinbar zählen nur bis zum fertigen code ausgearbeitete endlösungen zu nicht genau gestellten problemen).

    std::string eingabe;
    cin>>eingabe;
    ...
    std::string str=objDOMDoc->selectSingleNode("string")->text;
    if(istGleich(eingabe,str))
    {
        markiere
    }
    

    yap danke.... aber das funktioniert eh nicht, denn wie schon in meinem eröffnungsthread beschrieben liefert die funktion objDOMDoc->selectSingleNode("string")->text; keinen string wert zurück. das ist ja auch eigentlich das problem, um das es die ganze zeit ging.... (wer lesen kann, ist klar im vorteil).

    eben aus genau diesem grund. dann wären marcus, sidewinder und co erstmal den ganzen tag mit pm beantworten beschäftigt, und dann jeweils 100 pms von 10 verschiedenen leuten zum gleichen Thema, weil dann niemand mehr mitlesen kann und alle dieselben Fragen haben. Ist schon gut so, wie es ist. Und zuguter letzt gibt es noch den irc channel, wo man das wesentlich besser machen kann.
    [/quote]

    ... geb ich dir vollkommen recht.

    und zu find: der rückgabewert ist aus gutem grund kein bool...warum wohl...
    http://www.cppreference.com/cppstring/find.html

    ...ähm ja. warum auch bool? eigentlich habe ich nicht gesagt das ich bool zurückgegeben haben will. ? 😕

    naja egal.

    anyway - ich habe mich mal an den lösungsvorchlag mit dem "datei auslesen" gehalten. und das dann in zwei strings (original und kopie, mit verkleinerten buchstaben) zu vergleichen; mit hilfe der position. hat wunderbar geklappt. thx. nochmal. hier meine lösung.... wenn denn mal wieder jemand so in der art probleme haben sollte (was ich aber anzweifel).
    sieht 'n bissl umständlich aus mit dem vielen hin und her konvertiere.... musste aber sein. bissl was werd ich sowieso noch umändern, aber so funktioniert es erstmal....

    std::string searchNode(std::string eingabe, char * file)
    {
    	const char * w = new char[eingabe.length()];
    	w = eingabe.c_str();
    	char * Eingabe = new char[eingabe.length()];
    	unsigned i;
    	for(i=0; i<eingabe.length(); i++)
    	{
    		Eingabe[i]=w[i];
    	}
    	Eingabe[i]='\0';
    	std::string text="";
    	char tmp1[10000];
    	FILE * fp;
    	fp = fopen(file,"r");
    	int end = 0;
    	for(int i=0; end != EOF ; i++)
    	{
    		fgets(tmp1,1000,fp);
    		text+=tmp1;
    		end=fgetc(fp);
    	}
    	fclose(fp);
    	const char * a = new char[text.length()];
    	a = text.c_str();
    	char * XMLString_Kopie = new char[text.length()];
    	char * XMLString_Original = new char[text.length()];
    	char * EndErgebnis = new char[eingabe.length()];
    	for(i=0; i<text.length(); i++)
    		XMLString_Original[i]=a[i];
    	XMLString_Original[i]='\0';
    	//tolower xml string
    	for(unsigned i=0; i<text.length(); i++)
    	{
    		if(a[i]>64 && a[i]<91)
    			XMLString_Kopie[i]=a[i]+32;
    		else
    			XMLString_Kopie[i]=a[i];
    	}
    	XMLString_Kopie[i]='\0';
    
    	//tolower xml string
    	for(unsigned i=0; i<eingabe.length(); i++)
    	{
    		if(Eingabe[i]>64 && Eingabe[i]<91)
    			Eingabe[i]=Eingabe[i]+32;
    		else
    			Eingabe[i]=Eingabe[i];
    	}
    	eingabe = Eingabe;
    	std::string XMLString_Kopie_S = XMLString_Kopie;
    	int pos = XMLString_Kopie_S.find(eingabe);
    	unsigned j;
    	for(j=0; j<eingabe.length(); j++)
    	{
    		if(pos>0)
    		{
    			EndErgebnis[j]=XMLString_Original[pos];
    			pos++;
    		}
    	}
    	EndErgebnis[j]='\0';
    	std::string asd = "//";
    	asd+=EndErgebnis;
    	return asd;
    }
    


  • M@tt schrieb:

    yap danke.... aber das funktioniert eh nicht, denn wie schon in meinem eröffnungsthread beschrieben liefert die funktion objDOMDoc->selectSingleNode("string")->text; keinen string wert zurück. das ist ja auch eigentlich das problem, um das es die ganze zeit ging.... (wer lesen kann, ist klar im vorteil).

    sorry, aber das hast du nicht gesagt:

    lso mein genaues Problem nezieht sich jetzt auf eine Funktion von MSXML6. Die Funktion(objDOMDoc->selectSingleNode("string")->text;) selbst hat aber nicht viel mit der Sache zu tun, außer das es sich hier um eine Suchfunktion handelt, welche einen String aus einem XML Dokument "markiert".

    du hast nur gesagt, dass es ein problem gibt, aber nicht welches und gehofft, dass alle wissen, welches problem das ist. Nr1. Wär mal nett zu wissen, von welchem Typ test ist. Also: wer sich ausdrücken kann ist klar im vorteil.

    und zu find: der rückgabewert ist aus gutem grund kein bool...warum wohl...
    http://www.cppreference.com/cppstring/find.html

    ...ähm ja. warum auch bool? eigentlich habe ich nicht gesagt das ich bool zurückgegeben haben will. ? 😕

    naja egal.

    nein, ich wollte damit nur ausdrücken, dass der rückgabewert bereits die position ist. der link hätte es dir genausogut sagen können.



  • LESEN....

    steht doch da....

    Achso und was noch zu sagen wäre. Man kann den eingegeben String nicht direkt mit dem vorhandenen testen, sondern muss es nach jeder Buchstabenänderung tun. Aufgrund, da die objDOMDoc->selectSingleNode("string")->text; - Funktion keinen String Rückgabewert hat und bei Fehlfunktion, sprich falscher Eingabe, das Programm abstürtzt. Letzteres ist aber kein Problem, da ich das mit try-catch behandle.

    ....

    nein, ich wollte damit nur ausdrücken, dass der rückgabewert bereits die position ist. der link hätte es dir genausogut sagen können

    .

    yap... hatte ich zwischenzeitlcih auch rausgefunden, aber trotzdem danke 😉



  • M@tt schrieb:

    LESEN....

    steht doch da....

    Achso und was noch zu sagen wäre. Man kann den eingegeben String nicht direkt mit dem vorhandenen testen, sondern muss es nach jeder Buchstabenänderung tun. Aufgrund, da die objDOMDoc->selectSingleNode("string")->text; - Funktion keinen String Rückgabewert hat und bei Fehlfunktion, sprich falscher Eingabe, das Programm abstürtzt. Letzteres ist aber kein Problem, da ich das mit try-catch behandle.

    steht nicht da. was gibts denn zurück?



  • M@tt sei bitte etwas freundlicher ;), schließlich bekommst du hier umsonst Hilfe

    🙂



  • KasF schrieb:

    M@tt sei bitte etwas freundlicher ;), schließlich bekommst du hier umsonst Hilfe

    🙂

    ok, aber was was kann ich dafür wenn einige nicht lesen können?!?!

    ...

    da die objDOMDoc->selectSingleNode("string")->text; - Funktion keinen String Rückgabewert hat

    Was für einen Rückgabewert sie hat spielt überhaupt keine Rolle, da dieser nicht Standard C ist, und ich ihn in dem Sinne für meine Suche nicht gebrauchen kann. Um es aber trotzdem zu sagen: IXMLDOMDocumentPtr.



  • *Hast schneller rausgedit, als ich darauf anworten konnte :)*



  • jo ^^ kann ja keiner wissen das stand-art == standard ist. 😉 schreib das eigentlich immer mit "t"



  • @M@tt also die msdn docu sagt mir, dass das ein string ist. die funktion gibt wzar nen document zurück, aber text ist ein string.


Anmelden zum Antworten