Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   HTML-Encoding in XML (https://www.delphipraxis.net/207164-html-encoding-xml.html)

Incocnito 1. Mär 2021 10:53

HTML-Encoding in XML
 
Hi Zusammen,

ich muss eine Delphi-Schnittstelle für XML-Dateien bauen.
Nun habe ich mit Hilfe einer Beispiel-XML und eines Online-Umwandlers eine XSD generieren lassen
und dann mit Delphi wiederum eine PAS-Datei. Wie wir alle wissen ist das nicht so spannend
aber wenigstens schonmal ein erster Schritt, damit man nicht alles selbst machen muss.
Ich habe nun zwei Probleme. Einmal ändert er das "Encoding" und einmal habe ich einen Knoten,
welchen ich nicht eingelesen bekomme.
Hier nun das erste Problem:
In der XML-Beispiel-Datei gibt es faktisch kein Encoding und Sonderzeichen werden durch
die HTML-Codes dargestellt. Somit ist es auch (fast) egal mit welchem Encoding ich das einlese.
Ein Beispielknoten sieht dann also wie folgt aus:
Code:
<name value="Hausarztpraxis Dr. Topp-Gl&#252;cklich" />
Wenn ich das einlese macht er mir zwar wunderbar "Hausarztpraxis Dr. Topp-Glücklich" davon,
aber wenn ich ein neues XML generiere und die Daten übernehme, steht beim Speichern der neuen
Daten
Code:
<name value="Hausarztpraxis Dr. Topp-Glücklich"/>
Er hat also sclicht das mit dem nächst-Besten Encoding (ich rate mal UTF-8)
gespeichert.
Die Frage ist also: Wie bekomme ich Delphi dazu alles wie im Original
"ohne Encoding" (ich weiß das ist jetzt auch nicht ganz richtig,
aber ich hoffe ihr wisst was ich meine) zu speichern.
Ich kann nicht sicherstellen, dass die Endstelle die Daten (sie sind nämlich ohne XML-Header)
mit dem richtigen Encoding einliest.
Unterm Strich will ich halt "ü" in den Daten stehen haben.

Das zweite Problem? Naja, später vielleicht.

MfG Incocnito

[Edit:] In dem Moment, wo ich auf Speichern gehe sehe ich, dass ich im falschen Bereich bin! Sorry Admins! Gerne verschieben!

Rolf Frei 1. Mär 2021 13:43

AW: HTML-Encoding in XML
 
Bei XML Dateien ist der Default UTF-8. Dateien ohne Encodingangaben werden als UTF-8 gelesen. Da musst du dich auch dran halten und die Daten als UTF-8 ins XML schreiben. Gleichzeitig auch noch den Text in den Nodes XML encoden.

Delphi-Quellcode:
function XMLEncode(const AStr: String): String;
const
  Convert = ['&','<','>','"',''''];
var
  Sp, Rp: PChar;
begin
  SetLength(Result, Length(AStr) * 10);
  Sp := PChar(AStr);
  Rp := PChar(Result);
  while Sp^ <> #0 do
  begin
    case Sp^ of
      '&': begin
             FormatBuf(Rp{$IFNDEF UNICODE}^{$ENDIF}, 5, '&amp;', 5, []);
             Inc(Rp,4);
           end;
      '<',
      '>': begin
             if Sp^ = '<' then
               FormatBuf(Rp{$IFNDEF UNICODE}^{$ENDIF}, 4, '&lt;', 4, [])
             else
               FormatBuf(Rp{$IFNDEF UNICODE}^{$ENDIF}, 4, '&gt;', 4, []);
             Inc(Rp,3);
           end;
      '"': begin
             FormatBuf(Rp{$IFNDEF UNICODE}^{$ENDIF}, 6, '&quot;', 6, []);
             Inc(Rp,5);
           end;
      '''': begin
             FormatBuf(Rp{$IFNDEF UNICODE}^{$ENDIF}, 6, '&apos;', 6, []);
             Inc(Rp,5);
           end;
    else
      Rp^ := Sp^
    end;
    Inc(Rp);
    Inc(Sp);
  end;
  SetLength(Result, Rp - PChar(Result));
end;

Incocnito 1. Mär 2021 16:08

AW: HTML-Encoding in XML
 
Ich musste den ursprungsbeitrag nochmal anpassen ...
Das Forum hatte aus "& #252;" (nur ohne Leerzeichen) automatisch "ü" gemacht.
Das führte die Frage natürlich ad absurdum.
Also nochmal kurz:
In den XML-Daten (String/Datei/whatever) steht die HTML-Notation ("& auml;" beispielsweise)
aber wenn ich die Daten auslese und wieder wegschreibe steht in den Daten das
UTF-8-Zeichen (dann also "ä"). Und das will ich nicht. Ich will die HTML-Notation behalten.
Geht das nicht? Muss ich dann die XML in einen String-Stream laden und mit Suchen-Ersetzen
alle Zeichen die mir einfallen manuell austauschen? Das würde ich nun nicht so feiern!

Anmerkung: Ich muss in die HTML-Codes Leerzeichen einfügen, da sonst das Forum mir das
weg-korrigiert.

Liebe Grüße
Incocnito

Rolf Frei 1. Mär 2021 19:27

AW: HTML-Encoding in XML
 
Das & uml; ist im XML-File eigentlich falsch. Da müssen nur die im obigen Code (XMLEncode) aufgezeigten Zeichen encodet werden. Das ä als UTF-8 im File ist so absolut richtig.

Noch als Bemerkung: & #252; ist kein UTF-8 Zeichen sondern der ISO-8859 ANSI Code. Bei UTF-8 wären das 2 ANSI 8Bit Zeichen. Jetzt frage ich mich natürlich, ob du die Datei wirklich in UTF-8 erstellst. Wenn Du TXMLDocument oder ähnliches zum Lesen/Schreiben nutzt, wird das automatisch konvertiert. Wenn du die XML-Date selber schreibst, musst du sicher stellen, das du die Datei korrekt im UTF-8 Format speicherst.

himitsu 1. Mär 2021 20:28

AW: HTML-Encoding in XML
 
Jupp, man sollte nicht HTML mit XML verwechseln. Per se sind das zwei komplett unterschiedliche Dinge, die nur rein zufällig ähnlich aussehn.
In HTML gibt es Dinge, die es in XML nicht gibt. (zusätzlich, dass HTML teilweise auch Fehlerresistent ist, bzw. die HTML-Parser können die krankesten Fehler ignorieren/beheben)
In XML gibt es nur die 5 Entity für & < > ' ", also die Steuerzeichen einer XML, und sonst muß alles mummerich kodiert sein.

XHTML ist HTML, was aber mit XML kompatibel ist, bzw. es "muß" dort valides XML sein (strict), womit es auch von XML-Parsern gelesen werden kann.

Incocnito 2. Mär 2021 08:51

AW: HTML-Encoding in XML
 
Es hat ja auch keinen XML-Header ...
es lässt sich halt mit den Bordmitteln von Delphis XML-Handling "einigermaßen" auslesen.
Da die Schnittstelle das so vorgibt werde ich das so machen müssen,
auch wenn es nicht XML-konform ist. ... Weil es vielleicht gar kein XML ist ... kp.
Zum Glück meckert Delphi nicht, dass die Daten im ungültigem XML vorliegen.
Solche Konstrukte komplett von Hand zu parsen fände ich nicht so spannend.
Das Ganze nennt sich wohl "FHIR" ... ich habe keinen Plan und kratze gerade erst an der Oberfläche.

himitsu 2. Mär 2021 09:41

AW: HTML-Encoding in XML
 
Laut Beschreibung ist FHIR (Fast Healthcare Interoperability Resources) die ganze Infrastructur drumrum.
Die Daten können mit "erprobten" Technologien representiert werden, also XML oder JSON, und sonst werden viele weitere "moderne" web-basierte Technologien genutzt (REST, HTML, TLS und OAUTH2).

Klingt zwar bissl Blablabla....,
aber somit wäre es schon richtig hier XML zu nutzen. :angle:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 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