String Case-Sensetive MSXML6 Problem
-
mmhhhh ja klingt nicht schlecht... das problem dabei ist, das sich die funktion später in ner dll befindet und daher die datei nicht immer geöffnet bzw. geschlossen werden kann. zudem wird sie ununterbrochen benutzt. und das ist mit den filestreams dann doch etwas langsam oder.
-
wieso sollte die immer geöffnet oder geschlossen werden? Ich denk mal dass die datei bereits komplett im Speicher ist, wenn du die strings vergleichen willst(eben im DOM)
-
...aber eigentlich - wie auch immer ich das einlese; was ich brauche ist ja der algo. wie ich das dann vergleiche...
-
wurde dir doch gesagt. strings kopieren, großbuchstaben in kleinbuchstaben uwwandeln, vergleichen.
statt "HALLO" und "HaLlO" vergleichen ist es einfacher "hallo" und "hallo" zu vergleichen.
-
lol... ist mir gerade eingefallen... wie soll ich bitte "HaLlo" aus der Datei auslesen, wenn ich nicht weiß nach was ich suchen soll. Denn wie gesagt, ich als Nutzer, weiß ja nicht was drin ist - d.h. ich weiß es schon - aber ich weiß nicht wie es geschrieben ist. Also wie soll ich dann die Datei auslesen und den String suchen, wenn ich nicht weiß, wie er geschrieben wird. lol. Womit ich wieder am Anfang meines Problems wäre.
[edited]
mmhhh noch ne andere frage... da ich bisher noch keine wirklich hilfreichen lösungsansätze bekommen hab; hat evtl. jemand ne ahnung wie man hier im forum pm schreiben kann?
-
thordk schrieb:
gibt bestimmt ne möglichkeit der lib mitzugeben, dass sie cases ignorieren soll. ist doch von microsoft, die ignorieren die überall
nochwas.... wie gesagt, msxml hat zwar viele funktionen - hab mich aber jetzt nochmal kundig gemacht. also irgendwas mit case sensetive ist anscheinend nicht drin; allein aus dem grund weil es ja gegen den xml standart verstoßen wurde.
-
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q315719
geh mal davon aus, dass es die verfahren auch für die c++ lib gibt.
-
M@tt schrieb:
lol... ist mir gerade eingefallen... wie soll ich bitte "HaLlo" aus der Datei auslesen, wenn ich nicht weiß nach was ich suchen soll. Denn wie gesagt, ich als Nutzer, weiß ja nicht was drin ist - d.h. ich weiß es schon - aber ich weiß nicht wie es geschrieben ist. Also wie soll ich dann die Datei auslesen und den String suchen, wenn ich nicht weiß, wie er geschrieben wird. lol. Womit ich wieder am Anfang meines Problems wäre.
ganz einfach: datei einlesen, komplett in kleinbuchstaben umwandeln und dann nen find algo rüberlaufen lassen. zb string::find. Und anstatt das Problem dauernd komisch umzuändern solltest du es genauer beschreiben. Wie auch immer. Es läuft, egal was du verlgeichen willst immer auf in kleinbuchstaben umwandeln und vergleichen/suchen hinaus.
[edited]
mmhhh noch ne andere frage... da ich bisher noch keine wirklich hilfreichen lösungsansätze bekommen hab; hat evtl. jemand ne ahnung wie man hier im forum pm schreiben kann?gibts nicht. aus gutem grund.
-
thordk schrieb:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q315719
geh mal davon aus, dass es die verfahren auch für die c++ lib gibt.
danke! aber sry... hab ich schon so und so ähnlich in der art ausprobiert. will nicht so wirklich...
otze schrieb:
gibts nicht. aus gutem grund.
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.
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.
wie schon im meinem eröffnungthread erwähnt, brauche ich eine funktion, die jede änderung des eingabestrings _sofort_ mit der funktion objDOMDoc->selectSingleNode("string")->text; abgleicht. sprich dieser den string als parameter übergibt. denn wie gesagt, ich kann nur mit dem originalen string abgleichen und nicht mit einer kopie, die verändert wurde.
noch mal zum verdeutlichen:
s1 "HalLO" steht in der xml
s2 "hallo" gebe ich ein-> dann kann ich nicht s1 tolower() machen und sagen, ja der string ist drin weil ja nun "hallo" == "hallo" ist
->ziel ist es s2 so zu verändern, dass er mit dem original s1 übereinstimmt; d.h. letztendlich s2 == "HalLO"
für mich war das eigtl. mit dem beispiel...
"hallo" -> Test ob funktioniert
"Hallo" -> " - "
"hAllo" -> " - "
"haLlo" -> " - "
"halLo" -> " - "
"hallO" -> " - "
"HAllo" -> " - "
"HaLlo" -> " - "... eindeutig erklärt, wie ich es haben will.
-
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 :)*