Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   XML: Text mit Umlaut in Node schreiben (https://www.delphipraxis.net/211175-xml-text-mit-umlaut-node-schreiben.html)

taveuni 8. Aug 2022 13:10

XML: Text mit Umlaut in Node schreiben
 
Bitte um Entschuldigung für die möglicherweise triviale Frage. Auch die Suche hier hat viele XML Ergebnisse geliefert aber nicht offensichtlich für mein Problem.
Ganz einfach:

Delphi-Quellcode:
  var
    XMLDoc: IXMLDocument;
    RootNode, ErrNode: IXMLNode;
    sXml: UTF8String;
  begin
    CoInitialize(Nil);
    Try
      XmlDoc:= NewXmlDocument;
      XmlDoc.Options:= [doNodeAutoIndent];
      XmlDoc.Active:= True;
      RootNode:= XMLDoc.AddChild('lpr:error', Format('http://%s/lpr',['127.0.0.1']));
      ErrNode:= XmlDoc.CreateElement('message','');
      ErrNode.NodeValue:= 'Dies ist ein Umlaut: ö.';
      RootNode.ChildNodes.Add(ErrNode);
      XMLDoc.Encoding:= 'utf-8';
      XmlDoc.SaveToXML(sXml);
    Finally
      CoUninitialize;
    End;
In sXml würde ich jetzt erwarten:

Code:
<?xml version="1.0" encoding="utf-8"?>
<lpr:error xmlns:lpr="http://127.0.0.1/lpr">
<message>Dies ist ein Umlaut: &ouml;.
</message>
</lpr:error>'
drin ist aber

Code:
<?xml version="1.0" encoding="utf-8"?>
<lpr:error xmlns:lpr="http://127.0.0.1/lpr">
<message>Dies ist ein Umlaut: ö.
</message>
</lpr:error>'
Was ein ungültiges XML bedeuted. Ich habe bisher nur haufenweise XML gelesen oder ohne Umlaute geschrieben.

Irgendwo habe ich noch das gefunden:

Delphi-Quellcode:
sXml:= TEncoding.UTF8.GetString(TEncoding.ANSI.GetBytes(string(XmlDoc.Xml.Text)));


Das wirft aber den Fehler: ---------------------------

Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt test.exe ist eine Exception der Klasse EEncodingError mit der Meldung 'Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden' aufgetreten.

Wo ist mein Denkfehler?

Papaschlumpf73 8. Aug 2022 13:33

AW: XML: Text mit Umlaut in Node schreiben
 
Versuch doch mal SaveToFile statt SaveToXML. Die Datei anschließend z.B. mit WordPad öffnen - Hauptsache eine App, die keine Ahnung von UTF8 hat. SaveToXML speichert ja auch in einem Unicode-String, den dir Delphi ggf. immer wieder mit sauberen Umlauten anzeigt.

taveuni 8. Aug 2022 13:44

AW: XML: Text mit Umlaut in Node schreiben
 
Was ich gerade bemerke. UTF8 codiert ist das XML mit "ö" korrekt. Korrekt?

@PapaSchlumpf: Das ist eigentlich schon die Lösung. UTF8 müssen die Umlaute nicht escaped werden?

Papaschlumpf73 8. Aug 2022 13:49

AW: XML: Text mit Umlaut in Node schreiben
 
Zitat:

Zitat von taveuni (Beitrag 1509882)
Was ich gerade bemerke. UTF8 codiert ist das XML mit "ö" korrekt. Korrekt?

@PapaSchlumpf: Das ist eigentlich schon die Lösung. UTF8 müssen die Umlaute nicht escaped werden?

Das sollte so passen, wie Delphi das auswirft. Wir erstellen so zig XML-Dateien auch mit Umlauten und Sonderzeichen usw. für andere Firmen. Konnte immer alles problemlos verarbeitet werden.

Uwe Raabe 8. Aug 2022 13:53

AW: XML: Text mit Umlaut in Node schreiben
 
Bei XML hätte ich für das ö eigentlich dies erwartet:
Code:
ö

taveuni 8. Aug 2022 13:57

AW: XML: Text mit Umlaut in Node schreiben
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1509884)
Bei XML hätte ich für das ö eigentlich dies erwartet:
Code:
ö

Stimmt. Grosse Verwirrung meinerseits. Ich hatte das Ergebnis aus dem Debugger in Notepad kopiert und dann gespeichert. Dann mit Notepad++ geöffnet und dieser hat gemeckert dass er eine ungültiges Zeichen "ö" im XML gefunden hat. Dies war aber natürlich weil ich die Datei nicht als UTF8 gespeichert hatte. Einen halben Tag vergeudet Mann Mann....

Von mir aus kann man diesen nutzlosen Thread löschen.
Danke trotzdem.

Uwe Raabe 8. Aug 2022 14:17

AW: XML: Text mit Umlaut in Node schreiben
 
Interessanterweise hatte ich das gar nicht so geschrieben, wie das dann dargestellt wurde. Daher hier nochmal den Code mit einem Leerzeichen hinter dem &, damit das nicht aufgelöst wird:

Code:
& #246;

taveuni 8. Aug 2022 14:30

AW: XML: Text mit Umlaut in Node schreiben
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1509886)
Interessanterweise hatte ich das gar nicht so geschrieben, wie das dann dargestellt wurde. Daher hier nochmal den Code mit einem Leerzeichen hinter dem &, damit das nicht aufgelöst wird:

Code:
& #246;

Oje. Und was stimmt nun? Beides?

Weil wenn ich das mache:

Delphi-Quellcode:

var
  XMLDoc: IXMLDocument;
  Node: IXMLNode;
  s: String;
begin
  XmlDoc:= TXmlDocument.Create(Nil);
  XmlDoc.LoadFromFile('c:xml1.xml');
//  XmlDoc.LoadFromFile('c:xml2.xml');
  Node:= XmlDoc.DocumentElement.ChildNodes.FindNode('message');
  if Assigned(Node) then
    s:= Node.NodeValue;
Ist bei beiden Varianten s "'Dies ist ein Umlaut: ö.'"

Die Verwirrung kehrt zurück....

xml1.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<lpr:error xmlns:lpr="http://127.0.0.1/lpr">
<message>Dies ist ein Umlaut: ö.
</message>
</lpr:error>'
xml2.xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<lpr:error xmlns:lpr="http://127.0.0.1/lpr">
<message>Dies ist ein Umlaut: & #246;.
</message>
</lpr:error>'
(ohne Leerzeichen nach dem &)

freimatz 8. Aug 2022 15:49

AW: XML: Text mit Umlaut in Node schreiben
 
Zitat:

Zitat von taveuni (Beitrag 1509878)
In sXml würde ich jetzt erwarten:
Code:
...
<message>Dies ist ein Umlaut: &ouml;.
...

Meines Wissen ist die Kodierung mit &...; für HTML, aber nicht für XML vorgesehen. Direkt in UTF8 reicht IMHO.

Rolf Frei 8. Aug 2022 17:11

AW: XML: Text mit Umlaut in Node schreiben
 
Du brauchst auch im HTML keine &uml;. Das wird nur benötigt, wenn kein Charset angegeben wird. Das #248 ist eh falsch, da das der Ansi Code des "ö" ist, also nicht UTF-8. In diesem Fall müsste die Codierung des XML auf ISO-8859-1 gesetzt werden und dabei auch die Datei als ANSI 8 Bit gepeichert werden.

Wenn im HEADER des XML als Charset UTF-8 steht oder komplett fehlt (Standard ist bei XML UTF-8), muss auch das Dokument entsprechend als UTF-8 gespeichert werden, damit die Umlaute als UTF-8 codiert im File stehen, sonst kommt es zu ungültigen Zeichen oder Konvertierungsfehlern (UTF-8 Umwandlung zurück in Uniocode oder ANSI).

Die HTML Entitäten für die Umlaute braucht es schon lange nicht mehr, weil dazu das Charset im Header verwendet wird.

Im XML muüssen nur die Standardzeichen des XML-Formats umgewandelt werden. (& < > / = ", etc.) Beispiel: "Müller&Meier" -> "Müller&amp;Meier"


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr.
Seite 1 von 2  1 2      

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