Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi MSXML: umlaute als entites abspeichern (https://www.delphipraxis.net/61555-msxml-umlaute-als-entites-abspeichern.html)

Aenogym 23. Jan 2006 08:31


MSXML: umlaute als entites abspeichern
 
hi ihr,

ich habe einen string mit umlauten. diesen string möchte ich mithilfe von MSXML in meiner XML-datei speichern. mein xml-dokument ist UTF8-kodiert, weshalb msxml die umlaute auch brav als UTF8 abspeichert. ich muss allerdings trotzdem die entities speichern... :?
ein StringReplace vorher ützt nichts, da das &-zeichen des entities beim abspeichern in & umgewandelt wird....

habt ihr einen tipp für mich wie ich, trotz UTF8-kodiertem dokument, umlaute als entities speichern kann?

danke,
aeno

Elvis 23. Jan 2006 08:47

Re: MSXML: umlaute als entites abspeichern
 
Wozu braucht man zu Zeiten von Unicode noch diese &uml-Dingsens?
Würde mich nicht wundern, wenn MSXML in den neueren Versionen nur in einem altertümlichen ANSI XML File diesen Krempel anlegt. ;)
Welche Anwendung verhält sich denn so eklig, dass sie noch die encodierten Umlaute braucht? Vllt kann man ja an der Seite schrauben um die Ursache anstatt der Symptome zu bekämpfen. ;)

Aenogym 23. Jan 2006 08:52

Re: MSXML: umlaute als entites abspeichern
 
Zitat:

Zitat von Elvis
Wozu braucht man zu Zeiten von Unicode noch diese &uml-Dingsens?
Würde mich nicht wundern, wenn MSXML in den neueren Versionen nur in einem altertümlichen ANSI XML File diesen Krempel anlegt. ;)
Welche Anwendung verhält sich denn so eklig, dass sie noch die encodierten Umlaute braucht? Vllt kann man ja an der Seite schrauben um die Ursache anstatt der Symptome zu bekämpfen. ;)

richtig, MSXML tut das eben aufgrund des UTF8. das programm, dass den inhalt der XML-datei anzeigt, zeigt aber leider diesen quatsch wie "ü" anstelle von "ü" an -.-

ich habe grad erfahren, dass es irgendetwas wie disable-output-encoding="yes" für XSL gibt.... vielleicht kann ich das irgendwie ja bei meinem problem verwenden. damit soll er nämlich den string so reinschreiben, wie ich ihm das sage.

aeno

AndreasP 23. Jan 2006 09:59

Re: MSXML: umlaute als entites abspeichern
 
mahlzeit,

da ich mal vor einem ähnlichen problem stand hab ich selbst dafür gesorgt das der widestring ordentlich in utf8 codiert wird. und zwar kannst du dafür:
Delphi-Quellcode:
Node.text := UTF8Encode(Value);
bzw.
Delphi-Quellcode:
if Assigned(Node) then
result := UTF8Decode(Node.text);
verwenden. dann wird zwar aus E:\äöüß@áè ein E:\äöüß@áè aber sowohl der IE6 als auch FF 1.5 zeigen es korekt an.

marabu 23. Jan 2006 10:42

Re: MSXML: umlaute als entites abspeichern
 
Hallo Steffen,

Zitat:

Zitat von Aenogym
das programm, dass den inhalt der XML-datei anzeigt, zeigt aber leider diesen quatsch...

der Fehler ist eindeutig bei diesem Programm zu suchen. Wenn aber du dieses Programm nicht verbrochen hast, dann kannst du unbotsame Zeichen in deinem XML-Dokument durch eine vorherige XSL-Identity-Transformation mit dem output-encoding "US-ASCII" in ihre numeric character entities umwandeln:

Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:output method="html" version="4.0" encoding="US-ASCII"/>

  <xsl:template match="/ | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()">
        <xsl:sort select="@titel"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
Je nach Inhalt deines Dokumentes musst du noch eine Anpassung machen. Oder du triffst bereits im IXMLDOMDocument Vorsorge, indem du dort eine XML-Deklaration mit der oben genannten Kodierung angibst:

Code:
<?xml version="1.0" encoding="US-ASCII"?>
In Verbindung mit einer DOCTYPE Anweisung können HTML Entities dann auch durch den MSXML Parser durchgeschleust werden, ohne dass sie verändert werden:

Code:
<!DOCTYPE html SYSTEM "html.dtd">
In der Datei html.dtd solltest du dann die gewünschten entities definieren:

Code:
<!ENTITY ouml "&#246;">
Wenn du aber Sonderzeichen in die Textknoten eingetragen hast und absolut HTML character entities gespeichert werden müssen, dann wirst du auf die Methode save() von IXMLDOMDocument verzichten und den wenig eleganten Weg über StringReplace() gehen müssen.

Zitat:

Zitat von Aenogym
ich habe grad erfahren, dass es irgendetwas wie disable-output-encoding="yes"

Das soll wohl disable-output-escaping heißen und hat deprecated status, weil man beim W3C erkannt hat, dass diese Anweisung mit XML eigentlich nicht vereinbar ist.

Grüße vom marabu

Aenogym 23. Jan 2006 16:39

Re: MSXML: umlaute als entites abspeichern
 
hallo ihr,

danke für die vielen antworten :)
ich habe mich jetzt für den weniger eleganten aber unkomplizierteren weg entschieden: das ganze manuell mit StringReplace abarbeiten und selber speichern. funktioniert ganz prima so...

aeno

Bernhard Geyer 23. Jan 2006 21:14

Re: MSXML: umlaute als entites abspeichern
 
Zitat:

Zitat von Aenogym
danke für die vielen antworten :)
ich habe mich jetzt für den weniger eleganten aber unkomplizierteren weg entschieden: das ganze manuell mit StringReplace abarbeiten und selber speichern. funktioniert ganz prima so...

Das "ominöse" Programm zeigt es jetzt "Korrekt" an aber kein anderes Programm kann das XML mehr anzeigen weil es kein korrektes XML mehr ist - stimmts? Also hast Du nur an den Symptome herumgedokter und hast vermutlich in wenigen Tagen noch viel größere Probleme da evtl. anderen Programme die auf korrekter XML angewiesen sind nicht mehr gehen.

Aenogym 24. Jan 2006 18:39

Re: MSXML: umlaute als entites abspeichern
 
Zitat:

Zitat von Bernhard Geyer
Das "ominöse" Programm zeigt es jetzt "Korrekt" an aber kein anderes Programm kann das XML mehr anzeigen weil es kein korrektes XML mehr ist - stimmts? Also hast Du nur an den Symptome herumgedokter und hast vermutlich in wenigen Tagen noch viel größere Probleme da evtl. anderen Programme die auf korrekter XML angewiesen sind nicht mehr gehen.

also ich habe mit dem stringReplace() erreicht, dass jetzt im gesamten XML-dokument nur noch entities (wie z.B. &auml;) auftauchen. das sollte doch eigentlich von jedem programm korrekt angezeigt werden.

außerdem wäre das egal, da es sich bei diesen XML-dateien um eine art projektdatei für ein firmeninternes programm handelt. diese dateien geraten niemals an die öffentlichkeit, weshalb wir uns hierbei um kompatibilität keine sorgen machen müssen ;)

Bernhard Geyer 24. Jan 2006 22:02

Re: MSXML: umlaute als entites abspeichern
 
Zitat:

Zitat von Aenogym
also ich habe mit dem stringReplace() erreicht, dass jetzt im gesamten XML-dokument nur noch entities (wie z.B. &auml;) auftauchen. das sollte doch eigentlich von jedem programm korrekt angezeigt werden.

Zieh es mal auf den IE oder Firefox. Wenn es dort pass dann sollte es kein problem geben.

Zitat:

Zitat von Aenogym
außerdem wäre das egal, da es sich bei diesen XML-dateien um eine art projektdatei für ein firmeninternes programm handelt. diese dateien geraten niemals an die öffentlichkeit, weshalb wir uns hierbei um kompatibilität keine sorgen machen müssen ;)

Dein Wort in Gottes Ohr. So oder so Ähnlich war es mit Sicherheit auch bei der Verwendung von 2 Zeichen für Datumangaben...

Aenogym 24. Jan 2006 22:20

Re: MSXML: umlaute als entites abspeichern
 
also der IE hat keine probleme damit (die entities sind von HTML geborgt und in usnerer DTD definiert).
es klappt alles wie gewünscht ;)


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