AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi TXMLDocument encoding wird nicht korrekt geschrieben
Thema durchsuchen
Ansicht
Themen-Optionen

TXMLDocument encoding wird nicht korrekt geschrieben

Ein Thema von T.E. · begonnen am 23. Jul 2012 · letzter Beitrag vom 7. Sep 2018
Antwort Antwort
T.E.

Registriert seit: 27. Mai 2007
Ort: Hamburg
284 Beiträge
 
Delphi XE2 Enterprise
 
#1

TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 23. Jul 2012, 14:23
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 23. Jul 2012, 14:38
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.
$2B or not $2B
  Mit Zitat antworten Zitat
T.E.

Registriert seit: 27. Mai 2007
Ort: Hamburg
284 Beiträge
 
Delphi XE2 Enterprise
 
#3

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 23. Jul 2012, 14:39
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...
Gruß Torben
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 23. Jul 2012, 14:50
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.
$2B or not $2B
  Mit Zitat antworten Zitat
T.E.

Registriert seit: 27. Mai 2007
Ort: Hamburg
284 Beiträge
 
Delphi XE2 Enterprise
 
#5

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 23. Jul 2012, 14:56
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...)
Gruß Torben
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 23. Jul 2012, 15:14
*
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');
...
$2B or not $2B
  Mit Zitat antworten Zitat
rdeutsch

Registriert seit: 24. Mär 2006
77 Beiträge
 
Delphi 12 Athens
 
#7

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 7. Mär 2014, 15:52
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 7. Mär 2014, 21:34
Ich glaub man kann irgendwie auf den Prozessingknoten zugreifen, dann könnte man diese Attribute manuell eintragen.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TXMLDocument encoding wird nicht korrekt geschrieben

  Alt 7. Sep 2018, 08:56
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-16then 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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter ( 7. Sep 2018 um 08:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 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