![]() |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Liste der Anhänge anzeigen (Anzahl: 1)
Hab' mir doch etwas Zeit gelassen.
Ich habe ein Archiv mit der Klasse und 2 Kompilaten (1.1 und 2.0) angehängt. Falls du es selbst kompilieren willst: Als Compiler empfehle ich dir die Mono version ( ![]() Kompiliert wird für jeweils eine bestimmte .Net Version so:
Code:
chrome.exe SampleLib.chrome /frameworkversion=v1.1.4322 out=1.1
chrome.exe SampleLib.chrome /frameworkversion=v2.0.50727 out=2.0 |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Cool Danke, Robert!
Ich werde mir das nachher zu Hause mal in Ruhe anschauen. Nachtrag: Im Prinzip hatte ich es so eigentlich auch. Nur konnte Delphi merkwürdiger Weise nicht von IXmlSerializable ableiten :stupid:. Ich werde es nachher noch mal probieren. Oder noch besser lasse es einfach sein und nehme für so was wirklich den Chrome- oder C#-Compiler ;). |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Zitat:
Zitat:
|
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Ich habe jetzt einfach mal zum Testen deine fertige Lib verwendet.
Und es scheint zur Hälfte zu funktionieren :). In der XML-Datei soll ein SQL-Statement abgespeichert werden. Dieses wird gleich am Anfang an eine (Fremd-) Komponente (Win32, ActiveX) weitergegeben. Theoretisch mit dem CDATA-Abschnitt ja kein Problem. Bisher habe ich zum Testen ohne CDATA gearbeitet - hat mit der Komponente funktioniert. Um die gleichen SQL-Statements habe ich nun ein <![CDATA[ und ein ]]> geschrieben. Dann das Object (CData statt String) angepasst und *wuppdi* hätte es funktionieren müssen. Die verwendete Komponente sagt mir den folgenden Fehler: Zitat:
SQL-Code:
Genau dieses Statement hat zu vor funktioniert.
---------------------------
--------------------------- SELECT Artikel.[Artikel-Nr], Artikel.Artikelname, Artikel.[Lieferanten-Nr], Artikel.Lagerbestand FROM Artikel ORDER BY Artikel.[Artikel-Nr] where (Artikel.[Artikel-Nr] between 1 and 10) --------------------------- OK --------------------------- Kann es sein, dass die Komponente irgendwelche Codierungen verwechselt? Hast du eine Idee, woran das liegen könnte? Besten Dank nochmals, Alexander |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Zitat:
Zitat:
Sehr dumm ist es, wenn die Komponente ein Object schluckt und dann einfach anhand des Typen irgendwas friemelt. Deshalb würde ich einen Cast auf String empfehlen. Außerdem ist es nicht dumm der XML Datei ein Unicode-Format zu geben um Konvertierungsprobleme gleich von Anfang an auszuschließen. Es ist leider nicht möglich den inneren Text öffentlich zugänglich zu machen ohne Inkonsistenzen zu riskieren. CData muss als primitiver Typ auftreten, auch wenn es eigentlich nur ein Wrapper um einen String ist. btw: Diese eckigen Klammern gibt es eigentlich nur in den beiden komischen Accessversionen, die Microsoft DBMS nennt: Dem serverbasierten Access namens SqlServer und dem clientbasierten Access namens Jet/Access. :mrgreen: Bei einen richtigen/normalen DBMS werden Bezeichner, die gegen die Regeln normaler Bezeichner des DBMS verstoßen, in Anführungszeichen ( #34 ) eingeschlossen. Wobei die Bezeichner dann auch case sensitive sind! [1]der Teil vor dem letzten Punkt in deinen Unitnamen, DfN-Namespaces sind, höflich ausgedrückt, komisch |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Zitat:
Zitat:
Zitat:
Zitat:
Nachtrag: Zum Source: Die Lade und Speicher Methode und ein Test-Object stehen ja oben schon. Und so setze ich einfach das SQL-Statement:
Delphi-Quellcode:
Das war's im Prinzip.
Cube.DCRecordSource := aStatement.Sql;
|
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Zitat:
Zitat:
Zitat:
Wirkliche Klarheit wird dir nur der Debugger liefern können. Einfach mal schauen, was in CData drin steht. Da CData ToString überschreibt sollte der Inhalt zu sehen sein ohne es aufklappen zu müssen. :) |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Ich habe es jetzt noch mal mit dem Chrome-Compiler neu kompiliert (nun auch mit nem ordentlichen Namespace).
Zitat:
Zitat:
(Hast du dir dein Wissen eigentlich selbst beigebracht? ) Zitat:
Es handelt sich im Übrigen um diese Komponente: ![]() Allerdings in einer etwas älteren Version (2.5). |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Zitat:
Zitat:
Zitat:
Denn bei einem Zeilenumbruch geht definitiv der Cr (#13) flöten, wenn man nicht explizit über einen XmlReader deserialisiert... Hier mal zur Anschauung
Delphi-Quellcode:
Interessant ist was dabei rauskommt:
type
SampleClass = public class public property CDataString : CData; end; class method ConsoleApp.Main; const fileName = 'data.xml'; const sampleString = 'SELECT A, B'#13#10 'FROM C'; method ShowWhiteSpaces(value : String); begin Console.WriteLine(value.Replace(#32, '[Space]') .Replace(#9, '[Tab]') .Replace(#13#10, '[CrLf]') .Replace(#13, '[Cr]') .Replace(#10, '[Lf]')); end; begin var serializer := new XmlSerializer(typeof(SampleClass)); if not File.Exists(fileName) then using stream := new FileStream(fileName, FileMode.Create) do using writer := new XmlTextWriter(stream, Encoding.UTF8) do begin serializer.Serialize(writer, new SampleClass(CDataString := sampleString)); end; // mit reader using stream := new FileStream(fileName, FileMode.Open) do using reader := new XmlTextReader(stream) do with s := serializer.Deserialize(reader) as SampleClass do ShowWhiteSpaces(s.CDataString); // ohne reader using stream := new FileStream(fileName, FileMode.Open) do with s := serializer.Deserialize(stream) as SampleClass do ShowWhiteSpaces(s.CDataString); Console.ReadLine(); end; Output SELECT[Space]A,[Space]B[CrLf]FROM[Space][Space][Space]C SELECT[Space]A,[Space]B[Lf]FROM[Space][Space][Space]C |
Re: XMLSerializer: Verschachtelte XML-Dateien mit Arrays?
Das war's auch nicht.
Es sind keine lf's, tabs etc. im String drin. Leider :sad:. Ich habe gerade mal versucht, das SQL-Statement mit beiden Varianten auszulesen, um den String vergleichen zu können.
Delphi-Quellcode:
Leider bekomme ich da zur Laufzeit einen Fehler:
TStatement = class
public Connection : TDataBaseConnection; [XmlElement('Sql')] Sql2 : String; Sql : CDataLib.CData; end; Zitat:
Delphi-Quellcode:
(TStatement taucht in TData wieder auf).
Ser := XmlSerializer.Create(typeOf(TData));
Ist das nicht möglich oder bin ich da auf dem Holzweg? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 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-2025 by Thomas Breitkreuz