![]() |
Re: himXML (gesprochen himix ML)
OK, waren zwar mehr, als nur ein paar Minuten,
aber was sind schon fast genau 2277 Minütchen :angel2: Nja, zumindestens kompiliert es wieder unter D2006 (TDE) und vermutlich auch unter D2007 (welches ich nicht zur Hand hab). |
Re: himXML (gesprochen himix ML)
Zitat:
// Edit: Ja, es kompiliert mit Delphi2007 :-) Gruß Patrick |
Re: himXML (gesprochen himix ML)
Zitat:
ja und in Delphi 2010 läuft es nun ebenfalls Außerdem hab ich die entsprechenden Stellen so angepaßt, daß ich nun z.B. die Größenangabe eines Arrays vornehm, anstatt Array[TTypeKind], womit es bei zukünftigen Erweiterungen der RTTI weiterhin funktioniert. Und wenn einer Erweiterung/Änderung erkannt wird, dann wird eine Compilerwarnung ausgegeben und mit nur den bekannten Typen gearbeitet, anstatt da die Compilierung abbricht. |
Re: himXML (gesprochen himix ML)
himi,
irgendwat passt da bei der TXMLIniFile nicht, oder ich bin schlicht zu doof: Wenn ich einen DateTime-Wert auslesen will, bekomme ich dit hier: Zitat:
Delphi-Quellcode:
Der Key sieht so aus:
Function TXMLIniFile.ReadDateTime(Const Section, Ident: String; Default: TDateTime): TDateTime;
Begin If ValueExists(Section, Ident) Then Try Result := _XML.RootNode.Nodes['section>name=' + Section].Nodes['ident>name=' + Ident].Text; //<= Kaboom.. :P Except Result := Default; End Else Result := Default; End;
XML-Code:
Gelesen wird so:
<section name="Overview">
<ident name="DoUseLastTimeSpan">True</ident> <ident name="FromDate">2009-06-06T12-04-43.687</ident> <ident name="ToDate">2009-10-06T12-04-43.687</ident> <ident name="DateSelection">7</ident> </section>
Delphi-Quellcode:
Geschrieben so:
fFromDate := fXMLIni.ReadDateTime('Overview', 'FromDate', Now);
fToDate := fXMLIni.ReadDateTime('Overview', 'ToDate', Now);
Delphi-Quellcode:
Und manchmal tritt dieser Fehler auf:
fXMLIni.WriteDateTime('Overview', 'FromDate', fFromDate);
fXMLIni.WriteDateTime('Overview', 'ToDate', fToDate); Zitat:
Und nu' kommst du. :stupid: |
Re: himXML (gesprochen himix ML)
Ups, kennst du das Problem, wenn man 'ne Indexzählung umstellt und sich dann verzählt? :oops:
Das Ergebnis war, daß die TDateTime-Werte nimmer von ihrer XML-Darstellung in ein passendes Format umgewandelt wurden :wall:
Delphi-Quellcode:
// diese Funktionen in der himXML.pas einfach ändern
Class Function TXHelper.isXMLDateTime(Const S: TWideString): Boolean; Var P, i, i2, i3: Integer; D: TDateTime; Begin P := 0; If (Length(S) >= P + 10) and (S[P + 5] = '-') and (S[P + 8] = '-') and TryStrToInt(Copy(S, P + 1, 4), i) and TryStrToInt(Copy(S, P + 6, 2), i2) and TryStrToInt(Copy(S, P + 9, 2), i3) and TryEncodeDate(i, i2, i3, D) Then Inc(P, 10); If (Length(S) >= P + 9) and (S[P + 1] = 'T') and (((S[P + 4] = '-') and (S[P + 7] = '-')) or ((S[P + 4] = ':') and (S[P + 7] = ':'))) and TryStrToInt(Copy(S, P + 2, 2), i) and TryStrToInt(Copy(S, P + 5, 2), i2) and TryStrToInt(Copy(S, P + 8, 2), i3) and TryEncodeTime(i, i2, i3, 0, D) Then Inc(P, 9); If (Length(S) >= P + 4) and (S[P + 1] = '.') and TryStrToInt(Copy(S, P + 2, 3), i) Then Inc(P, 4); If (Length(S) >= P + 1) and (S[P + 1] = 'Z') Then Inc(P); Result := Length(S) = P; End; Class Function TXHelper.XMLToDateTime(Const S: TWideString): TDateTime; Var P, i, i2, i3: Integer; D: TDateTime; Begin Result := 0; P := 0; If (Length(S) >= P + 10) and (S[P + 5] = '-') and (S[P + 8] = '-') and TryStrToInt(Copy(S, P + 1, 4), i) and TryStrToInt(Copy(S, P + 6, 2), i2) and TryStrToInt(Copy(S, P + 9, 2), i3) and TryEncodeDate(i, i2, i3, D) Then Begin Inc(P, 10); Result := D; End; If (Length(S) >= P + 9) and (S[P + 1] = 'T') and (((S[P + 4] = '-') and (S[P + 7] = '-')) or ((S[P + 4] = ':') and (S[P + 7] = ':'))) and TryStrToInt(Copy(S, P + 2, 2), i) and TryStrToInt(Copy(S, P + 5, 2), i2) and TryStrToInt(Copy(S, P + 8, 2), i3) and TryEncodeTime(i, i2, i3, 0, D) Then Begin Inc(P, 9); Result := Result + D; End; If (Length(S) >= P + 4) and (S[P + 1] = '.') and TryStrToInt(Copy(S, P + 2, 3), i) Then Begin Inc(P, 4); Result := Result + (i / (24*60*60*1000)); End; If (Length(S) >= P + 1) and (S[P + 1] = 'Z') Then Inc(P); If Length(S) <> P Then Raise EXMLException.Create(Self, 'XMLToDateTime', @SCorupptedDateTime, Copy(S, P + 1, 20)); End; Was das Andere betrifft ... das ist erstmal ein Fehler im FileStream, welcher meckert, daß da eine Datei nicht geöffnet werden konnte. Problem dabei ist, daß die TWideFileStream-Klasse nur eine "Kopie" von TFileStream ist und ich da bis auf das Unicode nichts geändert hab ... erstmal möchte ich an diesem Stream natürlich nichts ändern und es würde auch nichts bringen, wenn ich da versuche etwas zu ändern. :angel2: Aber so wie es aussieht, ist diese Datei wohl schon geöffnet und ja ... keine Ahnung was Windows da genau will. [google]"Der Vorgang ist bei einer Datei mit einem geöffneten Bereich, der einem Benutzer zugeordnet ist, nicht anwendbar"[/google] |
Re: himXML (gesprochen himix ML)
Zitat:
Und mit der zweiten Meldung... Hmm... :gruebel: |
Re: himXML (gesprochen himix ML)
Wie gesagt, dein 2. Problem kann ich so erstmal nicht beheben ... dafür müßte man erstmal rausbekommen, wer oder was die Datei zu diesem Zeitpunkt noch geöffnet hält und müßte dieses dann beheben.
So, die kleinen Änderungen aus Post #165 sind in den beta-Download mit eingeflossen. Und dann wurde ein böser Fehler in der Kodierung entdeckt, welcher beim Einlesen sozusagen das Encoding, welches im BOM angegeben ist einfach ignorierte/überschrieb. > ![]() Nun noch etwas zu Razor's Problemchen: > UTF-16 wird halt nicht unterstützt Wenn nun nichts UTF-16-Spezifisches vorhanden hist, dann könnte man entweder einfach das Encoding-Attribut gegen Unicode (ISO-10646-UCS-2) austauschen
XML-Code:
oder dieses, mit ein paar kleinen Änderungen, einfach als Unicode parsen lassen :angel2:
<?xml version="1.0" encoding="ISO-10646-UCS-2" ?>
Delphi-Quellcode:
! Zeilenangaben entsprechen der Version v0.98 beta von heute (07.10.2009 14³°)
{Zeile 584}
{alt} TXMLEncoding = (xeUTF7, xeUTF8, {xeUTF16,} xeUnicode, xeUnicodeBE, ... {neu} TXMLEncoding = (xeUTF7, xeUTF8, xeUTF16, xeUnicode, xeUnicodeBE, ... {Zeile 1515} {alt} //({xeUTF16} Encoding: 'UTF-16'; CodePage: 1200; CharSize: 2), {neu} ({xeUTF16} Encoding: 'UTF-16'; CodePage: 1200; CharSize: 2), {Zeile 8431} {alt} xeUnicode, xeUnicodeBE: {neu} xeUnicode, xeUnicodeBE, xeUTF16: {Zeile 9106} {alt} xeUnicode, xeUnicodeBE: Begin {neu} xeUnicode, xeUnicodeBE, xeUTF16: Begin |
Re: himXML (gesprochen himix ML)
Sorry to ask but does is matter whats in the header of the xml file ?
I got this but it wont work. Zitat:
|
Re: himXML (gesprochen himix ML)
Zitat:
indirekt existiert es schon lange, und theoretisch sollte es auch keine Probleme geben, da ich aber z.B. das UTF-8 nicht nach UTF-16 umwandle und ansonsten auch alles nur als normales Unicode (alles nur 16-Bit-Einzelzeichen) behandle, hatte ich es einfach nicht direkt "freigegeben". |
Re: himXML (gesprochen himix ML)
So, nachdem ich nun wieder etwas mehr Zeit habe, bin ich auch mal wieder dazu gekommen, mein XML-Projekt weiterzubasteln.
Ich habe diesbezüglich mal eine allgemeinere Frage: Was kann man nun genau alles angeben, wenn man auf einen (tieferen) Knoten zugreifen will? Folgendes konnte ich schon (durch den Thread hier) herausfinden
Delphi-Quellcode:
Irgendwo hatte ich aber auch gelesen, dass man mit
Node['tag1\tag2\tag3']; // Ineinander verschachtelte Tags
Node['tag1[2]']; // Den 3. Tag mit dem Namen tag1 im aktuellen Knoten
Delphi-Quellcode:
den tag1 auswählen können soll, der als Attribut attr den Wert value hat. Das hat bei mir aber irgendwie nicht funktioniert, oder habe ich da etwas falsch verstanden?
Node['tag1>attr=value']
Wäre nett, wenn du da eine Art Übersicht machen könntest ;) (Falls eine solche existiert, dann habe ich sie noch nicht gefunden, ein Link reicht dann ^^) MfG Zwoetzen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz