Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi TXMLDocument encoding wird nicht korrekt geschrieben (https://www.delphipraxis.net/169485-txmldocument-encoding-wird-nicht-korrekt-geschrieben.html)

T.E. 23. Jul 2012 13:23

TXMLDocument encoding wird nicht korrekt geschrieben
 
Liebe Leute,

ich habe zur Zeit ein etwas merkwürdiges Verhalten bei meiner TXMLDocument festgestellt, aber zunächst meinen Code:
Delphi-Quellcode:
procedure TMain_Form.CreateXMLClick(Sender: TObject);
var
  newHead, newSub: IXMLDOMNode;
  fAppPath: String;
  LDocument: IXMLDocument;
  LNodeElement, NodeCData, NodeText: IXMLNode;
begin
  fAppPath := ExtractFilePath(ParamStr(0)) + 'tmp\';

  LDocument := TXMLDocument.Create(nil);
  LDocument.Active := True;

  LDocument.LoadFromXML
    ('<?xml version="1.0" encoding="UTF-8"?>' +
    '<TestElement>Inner text</TestElement>');

  LDocument.DocumentElement := LDocument.CreateNode('cnpsXML', ntElement, '');
  LDocument.DocumentElement.Attributes['ProjectID.DWD'] := '161428257';
  LDocument.DocumentElement.Attributes['CreatedByAppVersion'] := '3.20.0';

  LDocument.SaveToFile(fAppPath + 'test.xml');
end;
Wenn ich diesen Code ausführe und mir anschließend die XML anschaue, so steht in dieser nur folgendes:
Code:
<?xml version="1.0"?>
<cnpsXML ProjectID.DWD="161428257" CreatedByAppVersion="3.20.0"/>
Wenn ich statt encoding=UTF-8 einfach UTF-16 schreibe, so wird dieses korrekt übertragen.

Kann mir jemand sagen, wo der Fehler liegt?

Schöne Grüße und besten Dank!

himitsu 23. Jul 2012 13:38

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
UTF-8 ist der Standard ... ist sonst nix Anderes angegeben, dann ist jede XML immer UTF-8.

Und Standardwerte muß man nicht unbedingt speichern. (spart Platz/Speicher)



Mich wundert da schon eher, daß dein TestElement fehlt. :stupid:

T.E. 23. Jul 2012 13:39

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
Ah ok, hätte ich auch vorher drauf kommen können.

Danke :)

Edit: das mit dem Testelement ist mir auch schon aufgefallen, aber irgendwie scheint der immer nur den letzten Knoten im Quellcode zu schreiben... :(

himitsu 23. Jul 2012 13:50

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
Zitat:

Zitat von T.E. (Beitrag 1175667)
aber irgendwie scheint der immer nur den letzten Knoten im Quellcode zu schreiben... :(

XML muß/kann nur einen Root-Knoten haben.
Aber da hätte ich dann wenigstens eine Fehlermeldung erwartet, wenn man mehr einbaut.

T.E. 23. Jul 2012 13:56

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
Okay, aber wie soll man denn bitte die folgende Struktur erstellen, wenn man mit CreateNode nur den Root Knoten erstellen kann?

Code:
<?xml version="1.0" encoding="UTF-8"?>
  <cnpsXML ProjectID.DWD="161428257" CreatedByAppVersion="3.20.0">
    <Sources>
      <Module_0 Inpoint.QWD="-1" Outpoint.QWD="-1" Duration.QWD="4976100000" MultiSource.DWD="1">
        <ModuleData>
          <StreamTypeTable StreamSelector_0.DWD="0" StreamType_0.DWD="0" StreamPtr_0.DWD="0" StreamSelector_1.DWD="2" StreamType_1.DWD="0" StreamPtr_1.DWD="0"/>
          <SourceModules>
            <MultiSrcModule_0 MultiSource.DWD="0" Filename="E:\failed\20120503115047.MTS" CreatorMachine="TR2" CreatorUser="Administrator" FullUNCFilename="\\TR2\failed\20120503115047.MTS">
              <ModuleData m_rFrameRateOverride.DBL="50.000000" AspectRatio.BIN="AQAAAAEAAAA=" PixelAspect_X.DWD="1" PixelAspect_Y.DWD="1" audio_combine_streams.DWD="0" audio_stream_id.DWD="4352"/>
            </MultiSrcModule_0>
          </SourceModules>
        </ModuleData>
        <Filter_0/>
        <Filter_1/>
      </Module_0>
</cnpsXML>
Denn AddChild ist für mich nur ein Datensatz, wie z.B. ModuleData, oder liege ich da falsch? (Hab bisher noch nie mit Delphi und XML in Kombination gearbeitet, sollte man wohl dazu sagen...)

himitsu 23. Jul 2012 14:14

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
*
XML-Code:
<?xml version="1.0" encoding="UTF-8"?>
<cnpsXML/>
erstellen

* die Parameter für den Rootknoten setzen

* Unterknoten erstellen



Oder du erstellst ein Dokument, anstatt etwas zu laden (LoadFromXML).

XML-Code:
XML := TXMLDocument.Create(nil);
XML.DOMVendor := 'MS-XML-DOM';
XML.Active    := True;
XML.Version   := '1.0';
XML.StandAlone := 'yes';
XML.Encoding  := 'UTF-8';
XML.AddChild('cnpsXML');
...

rdeutsch 7. Mär 2014 14:52

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
Hallo

Möchte das Thema nochmals hochholen.

Zitat:

UTF-8 ist der Standard ... ist sonst nix Anderes angegeben, dann ist jede XML immer UTF-8.
Und Standardwerte muß man nicht unbedingt speichern. (spart Platz/Speicher)
Gibt es evtl. eine Möglichkeit den "encoding"-Hinweis beim XML-Erstellen zu erzwingen?

Gruss
Robert

himitsu 7. Mär 2014 20:34

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
Ich glaub man kann irgendwie auf den Prozessingknoten zugreifen, dann könnte man diese Attribute manuell eintragen.

Codehunter 7. Sep 2018 07:56

AW: TXMLDocument encoding wird nicht korrekt geschrieben
 
Da ich gerade vor genau dem selben Problem stand, hier die Lösung:
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  S, Encoding: string;
  S8: UTF8String;
  XML: IXMLDocument;
begin
  Encoding := 'UTF-8'; // ASCII, ISO-8859-1, UTF-8, UTF-16

  XML := TXMLDocument.Create(Nil);
  XML.Active := True;
  XML.Encoding := Encoding;
  if Encoding = 'UTF-16' then begin
    XML.SaveToXML(S);
    Memo1.Lines.Add(S);
  end else begin
    XML.SaveToXML(S8);
    Memo1.Lines.Add(string(S8));
  end;
end;
Der Kniff ist, dass sich TXMLDocument unterschiedlich verhält, je nachdem, welchen String-Typ man an SaveToXML übergibt.

Vermutlich verhält sich das auch noch unterschiedlich, je nachdem ob man mit einem NEXTGEN-Compiler (D2009+) oder einem alten arbeitet. Hier getestet mit 10.2.3 Tokyo.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz