![]() |
Re: himXML (gesprochen himix ML)
Hihu,
ich teste gerade selbst einige XML Parser, da der von MS wirklich nicht der schnellste ist. Ich glaube dein Parser hat einen Bug: XML:
Code:
<test>
<R A="X">X</R> </test> jetzt will ich das Attribut auslesen:
Delphi-Quellcode:
Außerdem:
txt := Xml.RootNode.Node['R'].Attributes.Name[0]; // A -> Richtig
txt := Xml.RootNode.Node['R'].Attributes.Value[0]; // 00:00:00 -> sollte aber X sein Ist es richtig, dass man mit
Delphi-Quellcode:
direkt auf das Attribut per Name zugreifen kann? Muetzes Funktion "AttributeByName" (oder bei dir entsprechend ValueByName) wäre mir jedenfalls aussagekräftiger.
Xml.RootNode.Node['R'].Attributes.ValueCS['A']
Edit: hab gesehen geht auch über Value :) Falls Muetze es mitliest: Kann ich deine XML-Lib in der Firma verwenden (bisher nur intern für nen XML-Testprogramm, eventl. später kommerziell?) |
Re: himXML (gesprochen himix ML)
Zitat:
Delphi-Quellcode:
Value, welches auch das defaultporperty ist, ist das Richtige und dort kann man entweder einen Index (Integer) oder einen Namen (String) angeben ... hab keine Extrafunktionen für "ByName" angelegt.
Xml.RootNode.Node['R'].Attributes.Value['A']
Xml.RootNode['R'].Attributes['A'] // .Node und .Value sind ja DEFAULT Xml.RootNode['R'].Attribute['A'] // gibt aber auch 'ne Weiterleitung, Xml.Attribute['R\A'] // welche auch im Dokumentelement verbaut wurde und sogar Pfade mag Das ValueCS ist nur 'ne Zusatzfunktion (standardmäßig wir alles CaseInsensitiv betrieben, aber man kann dieses ja über die Optionen umstellen ... nja und wenn es auf CaseSensitiv umgestellt ist, dann arbeiten die paar CS-Funktionen dennoch CaseInsensitiv) @Muetzes Lib: soweit ich weiß darfst du daß ... nur solltest du dich vorher einfach mal bei ihm melden ( ![]() PS: da ist seit gestern ein "netter" Bug in seiner Lib behoben wurden (also besser von seiner Seite mal updaten)
Delphi-Quellcode:
wegen dem werd ich mal schauen :shock:
<test>
<R A="X">X</R> </test> |
Re: himXML (gesprochen himix ML)
der
![]() Hatte für die Kompatibilität zu älteren Delphis eine eigene Trim-Funktion verbaut, welche etwas falsch verglich und Strings aus nur einem Zeichen zu einem Leerstring machte. :wall: ( kleines < statt einem <= mit großer Wirkung ) Und dazu kam dann noch ein etwas übereifriges isXMLDateTime, welches Leerstrings als Zeitstring erkannte. Das 00:00:00 war praktisch ein TDateTime mit dem Wert 0, welcher sich im Variant versteckte. Und Muetze1s neuste gebugfixte Version wurde auch gleich mit eingefügt. der Download versteckt in ![]() |
Re: himXML (gesprochen himix ML)
So ich hab auch nochmal ein paar Tests für meine Anforderungen gemacht:
~980MB auf 76 Dateien: JediSimple: ~185 Sekunden Muetze1: ~130 Sekunden himXML: ~250 Sekunden MS: ~730 Sekunden Ich greife dabei nur lesen auf die Daten zu. (Prüfung der Eingangsdaten auf fehlende Einträge) Sowohl Input als auch Output werden in anderen DOM-Parsern weiterverwendet. (daher reicht mir erstmal DOM, es sei denn SAX wäre noch schneller) Irgendwelche Tips wie ich das schneller bekomme? (PS: mit Pos dauter es ~ 20 Sekunden) |
Re: himXML (gesprochen himix ML)
Zitat:
|
Re: himXML (gesprochen himix ML)
Zitat:
|
Re: himXML (gesprochen himix ML)
Nachdem mein aktuelles Projekt ein ganzes Stück vorangekommen ist, habe ich nun die nächste Frage zur XML-Verarbeitung.
Mein Problem ist, dass ich alle Kinder eines Knotens durchlaufen will, wobei die Namen der Kinder unbekannt sind. Wie stelle ich das am einfachsten an? Bisher habe ich immer folgende Variante genutzt:
Delphi-Quellcode:
Damit werden logischerweise nur alle Tags mit dem Namen "code" durchlaufen (was bisher auch immer so gewünscht war), nur irgendwie sehe ich gerade keine Möglichkeit, dass ich alle Knoten erwische. Dabei würde ich gerne die for-in-Schleife behalten bzw. eine ähnlich einfache/kurze Alternative nutzen wollen.
var
Node, N: TXMLNode; begin // Node ist der Knoten, dessen Kinder untersucht werden sollen for N in Node.NodeList['code'] do ShowMessage(N.Name + N.Text); // Irgendwas mit N anstellen end; Vielleicht sehe ich auch nur den Wald vor lauter Bäumen nicht mehr, wird langsam spät :stupid: MfG Zwoetzen |
Re: himXML (gesprochen himix ML)
Da ich selber keine Enumeratoren implementiert hab, welche für das For-In nötig sind,
es aber netter Weise einen für dynamische Arrays gibt, geht es nur über NodeList, welches ja soein Array liefert. Nun kannst du auch überall NodeNamen genauso behandeln, wie z.B. Dateinamen bei FindFirst ( * und ? ). Also Folgendes würde dann alle Nodes durchgehn.
Delphi-Quellcode:
(abgesehn derer Node-Typen, welche über XML.Options versteckt wurden)
for N in Node.NodeList['*'] do
|
Re: himXML (gesprochen himix ML)
Mal was anderes, was eventuell nicht direkt mit dem Code zu tun hat. Aber das stört mich schon,m seit du die Bibliothek hier veröffentlicht hast: Der Name. Wenn man dazu schreiben muss, wie der Name ausgesprochen wird, ist es ein schlechter Name. Ein besserer Name wäre sicherlich der Verbreitung nur förderlich. ;)
|
Re: himXML (gesprochen himix ML)
Zitat:
Nja, hier ist nur die Groß-/Kleinschreibung dran Schuld, aber da diese heutzutage ehoftmals ignoriert wird, da dachte ich es fällt keinem auf. :lol: himxML = him(i)xML mit'm halbstummen i |
Re: himXML (gesprochen himix ML)
Ach Platzhalter kann man auch verwenden? Wieder was dazu gelernt :mrgreen:
Schnell mal getestet, und scheint wunderbar zu funktionieren. Danke für die Hilfe :) |
Re: himXML (gesprochen himix ML)
Jupp, das geht auch. :mrgreen:
Du kannst dir auch einfach mal den kleinen "leicht" unvollständigen Help-Abschnitt ganz oben in der himXML.pas ansehn. |
Re: himXML (gesprochen himix ML)
Da hatte ich extra nochmal reingeschaut gehabt, da ich mich erinnern konnte, dass es irgendwas mit * gegeben hat, aber da konnte ich nur
Delphi-Quellcode:
finden. Deshalb dacht ichd ann, dass es '*' für komplett alle Knoten wohl nicht geben würde. Zumindest kommt es nicht direkt rüber, dass es eben * und ? als die bekannten Platzhalter gibt ;)
// Node['*:node'] ignore namespace
// Node['name:*'] first/all nodes with this namespace (Vielleicht wurde die Hilfe auch schon erweitert, ich nutze aktuell die v0.98) |
Re: himXML (gesprochen himix ML)
Ohhh, ich dachte ich hätte es erwähnt. :oops:
|
Re: himXML (gesprochen himix ML)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo himitsu,
ich habe mich hier halbwegs durch den Thread geackert, da ich auf der Suche nach einer zuverlässigen und zugleich schnellen Verarbeitung von XML bin. Nun habe ich mir die v0.99 beta und die v0.9 runtegeladen und leider konnte ich gleich die erste Datei, die ich mit Demo_tree ausprobieren wollte nicht laden. Der erste Versuch (v0.99 beta) lieferte mir nur eine undankbare Fehlermeldung mit line 0 und col 0. Dann habe ich die Version 0.9 ausprobiert und siehe da, der Hinweis auf Zeile 44 meiner Datei. An diese Stelle (Zeile 44) steht aber nichts, womit XML nicht klar kommt. Vielleicht ist dort noch eine kleine Lücke. Main XML spy sagt: well formed und valid. Ich hänge mal die verkleinerte Test-XML an, vielleicht kann der XML-Großmeister was dazu sagen. Wäre schon toll, wenn wir dieses MSXML-Monster austauschen könnten. |
Re: himXML (gesprochen himix ML)
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
XML-Code:
Das Problem ist erstmal, daß aus irgendeinem Grund die nachfolgenden Nodes nach <link> nicht als Unterknoten weitergeführt werden
<links>
<link> <IssuesLink/> <object_uid> und demnach wird dann gemeckert, als das </link> vorbeikommt, da dort kein offenes <link> vorhanden ist. Den Grund kann ich so jetzt aber nicht rausfinden. - hab hier kein Delphi - und fahr diese Nacht auch noch für ein paar Tage weg. (hab 4 anstrengende Messetage vor mir) Sobald ich dann wieder Zeit hab, werd' ich den bösen Fehler mal suchen ... zumindestens sieht es wie ein Fehler in meiner Lib aus ... deine Datei scheint wohl OK zu sein. [edit] Sag mal, hast du die XML mit einem der beiden Demo_Tree-Programmen geöffnet? Konnte es grade auch nur mit diesen Testen, da ich nur diese, als einzige fertigkompilierte Programme, nutzen konnte. Dort gibt es eine "böse" Zeile, welche für einen kompatibilitätztest mit HTML-Dateien noch vorhanden ist (diese sollte ich demnächst mal entfernen)
Delphi-Quellcode:
Ein "link"-Node wird dadurch immer als "Single-Tag" angesehn ... also so als wäre er immer <link/>, selbst wenn <link> dasteht.
XML.ParsedSingleTags := 'meta|link|br|img';
Entferne diese Zeile aus der Demo und kompiliere sie neu, danach sollte es hoffentlich gehn. (kann's hier ja leider gerade nicht testen) [merke] Aber die Zeilenzählung in der Exceptionbehandlung muß ich mir dann auch mal ansehn, denn dieses "line 0 und col 0." sieht ja wohl nicht OK aus. |
Re: himXML (gesprochen himix ML)
Also SimpleXML kann die Datei problemlos einlesen :wink:
|
Re: himXML (gesprochen himix ML)
So, wird langsam Zeit für meine nächste Frage :p
Und zwar habe ich folgendes Problem: Ich brauche bestimmte Knoten, sagen wir <code>, die innerhalb von anderen Knoten sind. Am besten ein Beispiel:
Code:
Ich will nun die <code> innerhalb von <parent> und <child> haben, und nur diese, dh. ganz unten das <code> will ich nicht mehr.
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<root> <parent> <child> <code name="will ich" /> <code name="das auch" /> </child> <child> <code name="auch" /> </child> </parent> <parent> <child> <code name="will ich auch" /> <code name="haben will" /> </child> </parent> <code name="den will ich nicht" /> </root> Aktuell habe ich eine 3fach verwendete Schleife, nicht gerade das Gelbe vom Ei. Auf Seite 13 oder so wurde .FindNodes() erwähnt, doch konnte ich damit nicht die gewünschten Knoten bekommen.
Delphi-Quellcode:
Die eigentliche Frage kannst du dir sicher schon denken: Gibt es einen hübscheren Weg als die 3fach-Verschachtelte Schleife, an die Knoten zu kommen? ^^
procedure Test;
var XML: TXMLFile; Node: TXMLNode; Codes: String; N1, N2, N3: TXMLNode; begin XML := TXMLFile.Create; XML.LoadFromFile('C.\test.xml'); // 3fache Schleife... Nicht schön, liefert aber das gewünschte Ergebnis for N1 in XML.NodeList['parent'] do for N2 in N1.NodeList['child'] do for N3 in N2.NodeList['code'] do Codes := Codes + sLineBreak + N3.Attributes['name']; // for Node in XML.FindNodes['parent\child\code'] do // Liefert nur den ersten <code> // for Node in XML.FindNodes['code'] do // Liefert logischerweise auch den letzten <code>, aber auch nicht alle anderen // Codes := Codes + sLineBreak + Node.Attributes['name']; ShowMessage(Codes); XML.Free; end; FindNodes() klingt ja nach dem, was ich suche, nur entweder kann ich es nicht richtig anwenden oder da ist noch ein Fehlerchen drin :stupid: MfG Zwoetzen |
Re: himXML (gesprochen himix ML)
Aktuell sind die Schleifen wohl das Beste.
Leider hat FindNodes wirklich ein paar "Macken". Darum arbeite ich schon seit 'ner Weile an einer XPath-Variante, aber leider hängt es da an einigen Stellen. (vorallem an einer ![]() .FindeNodes ohne Pfade sollte mit dieser Änderung bessere Ergebnisse liefern
Delphi-Quellcode:
XML.FindNodes['code'] findet zumindestens alle 6 Code-Nodes.
Function TXMLNodeList.GetFindNodeArray(Name: TWideString): TXMLNodeArray;
Var N: TXMLNode; A, A2: TXMLNodeArray; i, i2: Integer; Begin //Result := nil; //N := NodeU[Name]; //If Assigned(N) Then Begin // SetLength(Result, 1); // Result[0] := N; //End; {}Result := NodeList[Name]; A := NodeList['*']; For i := 0 to High(A) do Begin A2 := A[i].FindNodes[Name]; If Assigned(A2) Then Begin i2 := Length(Result); SetLength(Result, i2 + Length(A2)); MoveMemory(@Result[i2], @A2[0], Length(A2) * SizeOf(TXMLNode)); End; End; End; |
Re: himXML (gesprochen himix ML)
Nagut, dann bleib ich erstmal bei den Schleifen.
Auf Seite 12 unten klang es so, als seien diese Funktionen schon fertig, und entsprechend war ich vom Ergebnis etwas verunsichert. ;) Danke für die schnelle Auskunft :mrgreen: |
Re: himXML (gesprochen himix ML)
Ich versuche erfolglos folgende XML-Datei zu laden (nur der relevante Anfang:
XML-Code:
usw.
<?xml version="1.0" ?>
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-07-01"> <OperationRequest> <RequestId>147c6ffa-697d-4a9b-86e0-2c9216c2cd60</RequestId> <Arguments> <Argument Name="Operation" Value="ItemSearch" /> <Argument Name="Service" Value="AWSECommerceService" /> <Argument Name="Signature" Value="uXLTuuePbsbl977Rcz+6TNyq3ihx3J52+KN6jt4DlSA=" /> <Argument Name="ItemPage" Value="1" /> <Argument Name="AssociateTag" Value="bla" /> <Argument Name="Version" Value="2009-07-18" /> <Argument Name="Keywords" Value="Matrix" /> <Argument Name="AWSAccessKeyId" Value="KEY" /> <Argument Name="Timestamp" Value="2010-05-02T18:52:50Z" /> <Argument Name="ResponseGroup" Value="Large" /> <Argument Name="SearchIndex" Value="DVD" /> </Arguments> <RequestProcessingTime>0.1835730000000000</RequestProcessingTime> </OperationRequest> <Items> <Request> <IsValid>True</IsValid> <ItemSearchRequest> <Condition>New</Condition> <DeliveryMethod>Ship</DeliveryMethod> <ItemPage>1</ItemPage> <Keywords>Matrix</Keywords> <MerchantId>Amazon</MerchantId> <ResponseGroup>Large</ResponseGroup> <ReviewSort>-SubmissionDate</ReviewSort> <SearchIndex>DVD</SearchIndex> </ItemSearchRequest> </Request> <TotalResults>130</TotalResults> <TotalPages>13</TotalPages> <Item> <ASIN>B001G5HB2I</ASIN> <DetailPageURL>http://www.amazon.de/Matrix-Complete-Trilogy-Keanu-Reeves/dp/B001G5HB2I%3FSubscriptionId%3D1HDS51J6EDYSCKF0YJ82%26tag%3Dtastenhacker-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB001G5HB2I</DetailPageURL> </Item> </Items> </ItemSearchResponse> Mein Code sieht so aus:
Delphi-Quellcode:
Ich bekomme aber für TotalResults und TotalPages immer eine 0. Wo liegt mein Problem?
procedure Parse(ResponseXML: string);
var XML: TXMLFile; I: integer; Movie: TMovie; PicURL: string; begin XML := TXMLFile.Create(); try ClearMovies(); XML.LoadFromXML(ResponseXML); with XML.Node['ItemSearchResponse'].Node['Items'] do begin Self.TotalResults := Node['TotalResults'].Text; Self.TotalPages := Node['TotalPages'].Text; for I := 0 to Nodes.Count - 1 do begin if Nodes[i].Name = 'Item' then begin // Mach was mit Item end; end; end; finally XML.Free; end; end; |
Re: himXML (gesprochen himix ML)
XML.Node['...'] entspricht with XML.RootNode.Node['...'] do
versucht mal statt
Delphi-Quellcode:
einfach nur
with XML.Node['ItemSearchResponse'].Node['Items'] do
Delphi-Quellcode:
with XML.Node['Items'] do
PS: Zum Test kannst du auch mal das standardmäßig gesetzte xoNodeAutoCreate aus den Options entfernen, dann sollte es eine Exception geben, weil ja auf einen nicht existierenden Node zugegriffen wird. |
Re: himXML (gesprochen himix ML)
hey himitsu, bin nun nach langem hin und her (vor allem wegen Threadsicherheit) von der MSXML auf deine Klasse umgestiegen.
Da ist mir doch gleich ein Fehler aufgefallen (v0.99d Beta 12.01.2010). Wenn ich den Wert einen Checkbox oder allgemeiner einen Boolean-Wert abspeichere, erwarte ich, dass True/False geschrieben wird. Deine Klasse schreibt bei Wahr jedoch $FFFF. Hab den Fehler mittels BoolToStr erstmal umgehen können. Ansonsten Top Arbeit :thumb: Beispiel:
Delphi-Quellcode:
<TXMLFile>.Nodes['xml'].Nodes['testwert'].Text := True;
|
Re: himXML (gesprochen himix ML)
Threadsicher ist meine Klasse aber auch nicht ... jedenfalls sollte man nicht von mehreren Threads aus den selben Node, bzw. die selbe NodeListe bearbeiten/ändern.
(diesbezüglich wird sich aber in der nächsten Version sehr viel ändern, vorallem da ich jetzt endlich eine gute Möglichkeit für die Nutzung von Interfaces gefunden hab ... hatte ja enorme Probleme mit Kreuzreferenzen und dudurch selbsthaltenden Datenstrukturen :? ) In der nächsten Version und wenn ich meine RexEx-Klasse (ePCRE) fertig hab, wird es wohl auch endlich XPath geben. Hhhhh, das nut den Boolean muß ich wohl nochmal nachsehn, der Grund hiefrür ist erstmal, daß in einem Variant nicht das 1-Byte-kleine Boolean, sondern das 2-Byte WordBool Verwendung findet. Boolean: True = 1 WordBool: True = -1 aka $FFFF Aber eigentlich dachte ich, ich hätte dieses entsprechend beachtet. :shock: Intern ist jedenfalls eine eigene Version von BoolToStr verbaut. Denn der Hauptgrund für den Nummerischen Wert ist, daß ich keine SubWerte vernichten wollte und es somit auch einen nummerischen Modus gibt, neben den TRUE- und FALSE-Ausdrücken für -1 und 0. > Ein Boolean, ByteBool, WordBool oder LongBool kennt nunmal nicht nur True und False, sondern noch viel mehr. PS: Das ist auch der Grund, warum man bei Abfragen nicht mit =True vergleichen darf. :zwinker: Aber wir gesagt, eigentlich sollte bei diesem $FFFF in der Datei TRUE drinstehn ... ich werd' es mir also nochmal ansehn. |
AW: himXML (gesprochen himix ML)
Hallo himitsu,
erstmal vielen Dank für Deine erstklassige Arbeit! Mir gefällt die himXML sehr gut! Zu meiner Frage: Ich möchte GUI-Komponenten als XML speichern und wieder laden. Also aus der XML wieder eine GUI erstellen. Das wollte ich mit TXMLNode.Serialize() machen, doch dann kommt einen Exception, die sagt dass es noch nicht implementiert ist. Schaut man in den Quellcode ist dort jedoch schon Code zu finden. Der ist jedoch noch nicht fertig und funktioniert noch nicht richtig? Oder wie soll man das verstehen? Was fehlt denn noch? Wie aufwändig wird es, das fehlende noch zu implementieren? Gibt es zeitliche Planungen für die Fertigstellung? PS: Welche von den beiden Archiven (himxml_246.7z, himxml_164.7z) ist die aktuelle Version? Man könnte meinen das wäre die himxml_246 weil 246 für 2.46 steht. Schaut man aber in die Archive rein, sind die neueren Dateien in 164 zu finden. Nach welchem Muster vergibst Du da die Versionsnummern? Gruß BlueStar |
AW: himXML (gesprochen himix ML)
Ja, mit diesem (De)Serialize gibt/gab es noch einige Problemchen :cry:
Diese Nummern in den Anhängen haben nichts zu sagen. Dieses stammen von der internen Verwaltung des alten Forums. - beide Dateien hießen himXML.7z und die Version war in den nun ebenfalls fehlenden Kommentaren aufgeführt. Das Aktuellere ist aber zufälliger Weise das mit der größeren Zahl (glaub ich). Was die Fertigstellung angeht: Bin grad/immernoch an einem anderem Projekt dran, welcher in der nächste himXML-Version verwendet werden soll. Eigentlich dachte ich irgendwo im Forum würde eine halbwegs funktioniere ältere Version der Objektserialisierung rumliegen, wenn ich nur wüßte wo ... hatte dazu mal 'nen Thread aufgemacht, wegen einiger Fragen zur Umsetzung. |
AW: himXML (gesprochen himix ML)
Hallo,
Hab deine Unit jetzt mal ausprobiert :mrgreen: Macht allerdings ein paar Probleme mit D2010:
Delphi-Quellcode:
Procedure TXMLNode.Serialize(C: TObject; SOptions: TXMLSerializeOptions = []; Proc: xXMLSerializeProc = nil);
Procedure _SavePropInfos(Node: xXMLNode; Info: PPropInfo); Const cTypeKind: Array[TTypeKind] of AnsiString = ('Unknown', 'Integer', 'Char', 'Enumeration', 'Float', 'String', 'Set', 'Class', 'Method', 'WChar', 'LString', 'WString', 'Variant', 'Array', 'Record', 'Interface', 'Int64', 'DynArray' , {$IF Declared(UnicodeString)} 'UString' {$IFEND}); Zitat:
Zitat:
Zitat:
|
AW: himXML (gesprochen himix ML)
hast du die mit der größeren Nummer (sind nur indexnummern des alten phpBBs) verwendet?
(eigentlich dachte ich ich hätte eine Version Oben, welche schon mit D2010 zurecht kommt) der gezeigte Codeausschnitt gehört jedenfalls zur älternen Version. :gruebel: Nja, ich bastel jetzt erstmal vorwiegend die Webseite, dann kommt da die Hilfe für's RegEx (ePCRE), die himXML und Anderes hin und danach wird's RegEx für's XPath ins himXML eingebaut und das himXML wieder auf selbstverwaltete (Refferenzzählung) Interfaces umgestellt. Wird irgendwie langsam zuviel, um noch alles zu überblicken, da Vieles zusammenhängt. |
AW: himXML (gesprochen himix ML)
Habe diese Version hier: himxml_246.7z
Wenn das die ältere Version sein sollte, dann ist die Benennung ziemlich irritierend :? |
AW: himXML (gesprochen himix ML)
Nja, original hießen beide mal himXML.7z und die Versionen standen in den nun nicht mehr existierenden Dateikommentaren.
hab nochmal reingesehn ... es ist doch andersrum :shock: (wie gesagt, die Dateinamen sind nicht von mir, daran isses neue Forum Schuld) himxml_246 = v0.9 21.05.2009 himxml_164 = v0.99d 12.01.2010 |
AW: himXML (gesprochen himix ML)
Wow, ich glaube ich lade mir doch die Version aus der Zukunft von 2020! :mrgreen:
Du könntest ja evtl. beide Versionen nochmal neu hochladen mit einem besseren Namen ;) |
AW: himXML (gesprochen himix ML)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo himitsu,
ich wollte gerade Dein himXML ausprobieren unter Delphi 2006. Leider bekomme ich keine Daten aus meiner XML-Datei ausgelesen. Könntest Du mir da vielleicht weiterhelfen. Das erste ist, wenn ich Deine Datei himXML.pas öffne, dann bekomme ich schonmal die Meldungen aus dem Anhang. Dann probiere ich es trotzdem mit folgenden Code die XML-Datei zu öffnen und Werte auszulesen :
Delphi-Quellcode:
Jedesmal bekomme ich eine AccessViolation in der Zeile
var
FormalXML : TXMLFile; begin FormalXML := TXMLFile.Create; try FormalXML.asXML := '"' + GetEnvVarValue('SystemRoot') + '\Performance\WinSAT\DataStore\2010-08-28 14.10.58.562 Formal.Assessment (Initial).WinSAT.xml"'; with FormalXML.Node['WinSAT'].Node['WinSPR'] do begin Label30b.Caption := Node['CpuScore'].Text; Label112b.Caption := Node['MemoryScore'].Text; Label113b.Caption := Node['GraphicsScore'].Text; Label114b.Caption := Node['GamingScore'].Text; Label115b.Caption := Node['DiskScore'].Text; end; finally FormalXML.Free; end; end;
Delphi-Quellcode:
. Das ganze führe ich unter Windows 7 x64 aus.
with FormalXML.Node['WinSAT'].Node['WinSPR'] do
Edit: Wenn ich das ganze so ausprobiere :
Delphi-Quellcode:
Bei dieser Variante wird noch der Pfad vom Arbeitsverzeichnis vor den übergebenen Pfad gesetzt. Somit funktioniert auch hier das Laden des XML-Files nicht.
var
FormalXML : TXMLFile; begin FormalXML := TXMLFile.Create; try FormalXML.LoadFromFile('"' + GetEnvVarValue('SystemRoot') + '\Performance\WinSAT\DataStore\2010-08-28 14.10.58.562 Formal.Assessment (Initial).WinSAT.xml"'); with FormalXML.Node['WinSAT'].Node['WinSPR'] do begin Label30b.Caption := Node['CpuScore'].Text; Label112b.Caption := Node['MemoryScore'].Text; Label113b.Caption := Node['GraphicsScore'].Text; Label114b.Caption := Node['GamingScore'].Text; Label115b.Caption := Node['DiskScore'].Text; end; finally FormalXML.Free; end; end; |
AW: himXML (gesprochen himix ML)
asXML ist der Inhalt der XML-Datei ... also der XML-Code selber.
Eine Datei laden kannst du über LoadFromFile
Delphi-Quellcode:
oder direkt beim Create
var
FormalXML : TXMLFile; begin FormalXML := TXMLFile.Create(; try FormalXML.LoadFromFile(GetEnvVarValue('SystemRoot') + '\Performance\WinSAT\DataStore\2010-08-28 14.10.58.562 Formal.Assessment (Initial).WinSAT.xml'); with FormalXML.Node['WinSAT'].Node['WinSPR'] do begin Label30b.Caption := Node['CpuScore'].Text; Label112b.Caption := Node['MemoryScore'].Text; Label113b.Caption := Node['GraphicsScore'].Text; Label114b.Caption := Node['GamingScore'].Text; Label115b.Caption := Node['DiskScore'].Text; end; finally FormalXML.Free; end; end;
Delphi-Quellcode:
Wie sieht denn die XML-Datei aus?
var
FormalXML : TXMLFile; begin FormalXML := TXMLFile.Create(nil, GetEnvVarValue('SystemRoot') + '\Performance\WinSAT\DataStore\2010-08-28 14.10.58.562 Formal.Assessment (Initial).WinSAT.xml'), False); try Label30b.Caption := FormalXML['WinSAT\WinSPR\CpuScore'].Text; Label112b.Caption := FormalXML['WinSAT\WinSPR\MemoryScore'].Text; ... Wenn "WinSAT" der Name des RootNode/Hauptknoten ist, dann kannst/mußt du .Node['WinSAT'] weglassen, da der Hauptknoten über XML.Node schon direkt angesprochen wurde. |
AW: himXML (gesprochen himix ML)
Hallo Himitsu,
danke erstmal für Deine prompte Antwort. Zitat:
Zitat:
Wenn ich Dein Beispiel übernehme, bekomme ich folgende Fehlermeldung : Zitat:
|
AW: himXML (gesprochen himix ML)
Nein, solche Dateien gibt es nicht.
Und auf die Schnelle bekomm ich die gefundene WinSAT.exe nicht zum laufen. |
AW: himXML (gesprochen himix ML)
Zitat:
|
AW: himXML (gesprochen himix ML)
Ohhh, das böse UTF-16 :shock:
OK, da müßtest du mal ein bissl "hacken". - in der himXML.pas nach xeUTF16 suchen und diese beiden/drei Funde entkommentieren - in TXReader.ReadData und und TXWriter.WriteDataX gibt es jeweils ein
Delphi-Quellcode:
,
Case _Encoding of
dort bei den Werten
Delphi-Quellcode:
noch das xeUTF16 mit hinzufügen.
xeUnicode, xeUnicodeBE
Dann sollte es "nutzbar" sein. |
AW: himXML (gesprochen himix ML)
Hallo himitsu,
danke für Deine Hilfe. Nun funktioniert Dein himXML erstklassig. :thumb: |
AW: himXML (gesprochen himix ML)
Zitat:
|
AW: himXML (gesprochen himix ML)
Hast Du da noch mehr auskommentiert, was man wissen sollte ?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 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