Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML.AddChild(): Probleme mit Sonderzeichen (https://www.delphipraxis.net/182460-xml-addchild-probleme-mit-sonderzeichen.html)

Peter Müller 26. Okt 2014 18:49

XML.AddChild(): Probleme mit Sonderzeichen
 
Hallo zusammen,

für eine größere Anwendung muss ich Daten aus SQL-Tabellen auch in XML-Dateien exportieren, was auch bereits fast problemlos funktioniert.
Dabei habe ich nur das Problem, dass in den Daten der SQL-Tabellen auch Sonderzeichen wie z. B. & enthalten sein können, die bei Xml.AddChild(Firmenname) die Fehlermeldung 'Dieser Name darf nicht das Zeichen '&' enthalten:' auslösen.

Kann ich alle problematischen Sonderzeichen irgendwie mit einer Standardfunktion herausfiltern oder durch die entsprechenden Entitäten ersetzen oder mache ich sonst was z. B. mit den Zeichensätzen falsch?

Hier ein Ausschnitt aus dem Sourcecode:
Code:
function SQL2XMLExport(Firmenname: AnsiString): Boolean;
var
  Xml:      IXMLDocument;
  RootNode: IXMLNode;

begin
  Xml := NewXMLDocument;
  Xml.Version := '1.0';
  Xml.Encoding := 'Windows-1252';
  Xml.Options := [doNodeAutoIndent];

  RootNode := Xml.AddChild(Firmenname);
  ...
end;
Vielen Dank für eure Antworten,

Peter

hstreicher 27. Okt 2014 06:58

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Texte mit "Illegalen" Sonderzeichen <> & klammert man in CDATA
Delphi-Quellcode:
<![CDATA[
alles erlaubt & <>
]]>
ggf muss man halt auf das Vorhandensein dieser Sonderzeichen prüfen und den Wert
entsprechend selbst anpassen

Delphi-Quellcode:
if pos('&',Firmenname)>0 then Firmenname='<![CDATA['+Firmenname+']]>';

Dejan Vu 27. Okt 2014 07:53

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Geht das nicht so?
Delphi-Quellcode:
type
  Windows1252String = type AnsiString(1252);

Var
  myCompany : Windows1252String;

Begin
  myCompany := 'Palhuber & Söhne';
  ...
  RootNode := myXML.AddChild(myCompany);
Die CDATA-Variante erscheint mir hier wie ein Workaround, der aber nicht nötig sein sollte.

himitsu 27. Okt 2014 07:59

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1277466)
Geht das nicht so?

Nein.

"&", "<", ">", " ", alles vor dem " " (Zeilenumbruch, Tab usw.) und natürlich die Zeichen " und ' sind in Node/Attribut-Namen niemals erlaubt, egal welche Kodierung
und abgesehn davon sind diese ASCII-Zeichen sowieso in jeder Kodierung identisch. :roll:

Innerhalb von Texten sind sie erlaubt, aber müssen durch die entsprechenden Entities ersetzt werden. (abgesehn von den Leer- und Steuerzeichen, welche aber als Leerzeichen eingelesen würden, wenn nicht kodiert oder z.B. in CDATA)
Welches ordentliche XML-Libs eh automatisch übersetzen. (beim Text)

Bernhard Geyer 27. Okt 2014 08:00

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Muss wirklich der Attribte-Name der Firmenname sein?
Sollte nicht eher ein Attribut "CompanyName" mit dem Wert des Firmennamens erzeugt werden :?:

Der schöne Günther 27. Okt 2014 08:20

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Genau das habe ich mich auch grade gefragt. Vor allem weil dabei Dinge wie das "&" (zumindest bei MS-XML) automatisch übernommen werden.

Dejan Vu 27. Okt 2014 12:23

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Zitat:

Zitat von himitsu (Beitrag 1277468)
Zitat:

Zitat von Dejan Vu (Beitrag 1277466)
Geht das nicht so?

Nein.

:wall: Ich war nur auf die Sonderzeichen aus. Knotenname geht so natürlich nicht und darf es auch nicht. Wozu gibt es eine XML-Definition? Delphi-Variablennamen dürfen ja schließlich auch keine Sonderzeichen beinhalten (außer '_')

himitsu 27. Okt 2014 13:31

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Joar, keine Steuer-/Leer-/Punktuationszeichen.
縻 und A0_ĂÞDŽƉҴҖﮚﭞﮊ繃縗 sind (seit 2009) gültige Bezeichner für Typen, Klasse, Variablen, Konstanten, Methoden, Property, Prozeduren, ...

Soooo viel Spielraum für eine extrem kompakte Obfuscation des Codes. :stupid:

Peter Müller 27. Okt 2014 22:42

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Vielen Dank für eure Antworten.

Habe es mal mit einem Attribut getestet, was mir aber weitere Probleme bereitet, da sehr viele Firmen in einer XML-Datei stehen sollen und ich die einzelnen Nodes dann nummerieren oder irgendwie anders als Unikate generieren muss. Seither war es eben der Firmenname, der nur jeweils einmal vor kam und nach dem konnte ich beim Import dann suchen. Kann ich in XML-Dateien auch über eine Standardfunktion nach Attributen suchen?

Könnte man nicht die Routine, die die Werte für das Attribut in Entitäten umwandelt, einfach auch für die Wandlung des Node-Namens verwenden? So eine Routine hatte ich eigentlich gesucht...

Viele Grüße

Sir Rufo 27. Okt 2014 23:41

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Ich glaube du hast eine völlig falsche Vorstellung von XML-Dateien und deren Aufbau/Struktur.

Hier mal ein Beispiel von http://de.wikipedia.org/wiki/Extensible_Markup_Language
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<verzeichnis>
     <titel>Wikipedia Städteverzeichnis</titel>
     <eintrag>
          <stichwort>Genf</stichwort>
          <eintragstext>Genf ist der Sitz von ...</eintragstext>
     </eintrag>
     <eintrag>
          <stichwort>Köln</stichwort>
          <eintragstext>Köln ist eine Stadt, die ...</eintragstext>
     </eintrag>
</verzeichnis>

Dejan Vu 28. Okt 2014 07:54

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Ich weiß nicht, wie man genau in Delphi mit XPath arbeitet. Aber jedenfalls kannst Du damit bequem nach einzelnen oder allen Attributen und Knoten suchen. Google mal, sieht ziemlich einfach aus.

Peter Müller 5. Nov 2014 17:53

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Vielen Dank für die Antworten.

XML-Dateien habe ich im Prinzip schon verstanden, was mich halt stört ist, dass Node-Namen nur einen Teilbereich des Zeichensatzes verwenden können und ich daher einen Node-Namen ohne "brauchbaren" Inhalt und ein Attribut oder CDATA zusätzlich verwenden muss, was unnötig viel Platz braucht und die Übersichtlichkeit in der XML-Datei nicht gerade erhöht.

Aber dann ist das halt so...

Peter

himitsu 5. Nov 2014 18:26

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Zitat:

Zitat von Peter Müller (Beitrag 1278819)
XML-Dateien habe ich im Prinzip schon verstanden, was mich halt stört ist, dass Node-Namen nur einen Teilbereich des Zeichensatzes verwenden können und ich daher einen Node-Namen ohne "brauchbaren" Inhalt und ein Attribut

Dann hast du XML doch nicht genug verstanden.

Genau wie im Delphi (Variablen, Typen usw.) gibt es eben Regeln, wie ein "Bezeichner" lauten muß, bzw. was alles erlaubt/verboten ist
und da beschwert sich doch auch keiner, daß man nicht alles nehmen kann.
Diese Regeln sind dafür da, damit man den Code einfach und vorallem sicher parsen kann und damit er auch halbwegs lesbar bleibt.
> Buchstaben, Zahlen und viele weitere Zeichen sind erlaubt, aber vorallem Steuerzeichen und die Interpunktion sind eben verboten.
Das & ist in XML nunmal ein Steuerzeichen.

PS: In diesen Bezeichnern sind, je nach Encoding (z.B. bei UTF-8), locker weit über 30.000 Zeichen erlaubt (irgendwas zwischen 30000 und 50000) und nur weil du zufällig einen der wenigen "verbotenen" Zeichen erwischt hast, kann man nicht gleich sagen, daß man dort nichts "Brauchbares" benutzen kann.
Es sind nunmal Bezeichner und nicht irgendein beliebiger Text.

Und was den "vielen Platz" betrifft, das sind auch nur mindestens 2 (Nodename+Leerzeichen) bis vielleicht 20 Zeichen, die da in jedem Node mehr benötigt werden, was der Übersichtlichkeit eigentlich keinen großen Abbruch dieht.



Du kannst auch gern andere Formate verwenden, wie z.B. JSON, welche etwas kompakter sind, aber auch da ist in Bezeichnern nicht alles erlaubt und ob das insgesamt besser lesbar ist?

PS: Willst du wirklich die XML ständig manuell bearbeiten, oder warum stören dich die paar zusätzlichen Bytes?



TReader und TWriter sind noch kleiner, vorallem in der binären Darstellung. -> siehe die DFMs vom Delphi

Dejan Vu 6. Nov 2014 07:56

AW: XML.AddChild(): Probleme mit Sonderzeichen
 
Und vor allen Dingen kann man einer XML nicht beliebige Knotennamen verpassen, denn eine XML wird normalerweise auch einer Grammatik (XSD) genügen müssen. Wenn Du also z.B. eine Liste von Freunden hast, dann geht das nicht so:
Code:
<Klaus>
  <Geburtstag>1990-10-20</Geburtstag>
  <Trinkfest>Ja</Trinkfest>
</Klaus>
<Hotte>
  <Geburtstag>1979-07-01</Geburtstag>
  <Trinkfest>Nein</Trinkfest>
</Hotte>
Weil es ja mehrere Freunde mit Namen 'Klaus' geben könnte, sondern z.B. so
Code:
<Freunde>
  <Freund Name ="Klaus">
    <Geburtstag>1990-10-20</Geburtstag>
    <Trinkfest>Ja</Trinkfest>
  </Freund>
  <Freund Name ="Hotte">
    <Geburtstag>1979-07-01</Geburtstag>
    <Trinkfest>Nein</Trinkfest>
  </Freund>
</Freunde>
Mit der 2.Version kannst Du vorher schon genau festlegen, wie deine XML-Datei aussehen soll, bei der 1.Version müsstest Du das bei jeder Freundschaftsänderung anpassen, was ziemlich lästig ist.

Beides ist -für sich genommen- jedoch wohlgeformtes XML, trotzdem wirst Du immer etwas in der Art von #2 sehen.

Wenn Du Dir also ein XML-Format ausdenkst, um bestimmte Daten zu speichern, dann erstellst Du idealerweise dafür gleich die XSD, also die formale Definition des Formates. Das kannst Du dann deinen Kommunikationspartnern geben und es reicht dann, wenn die eine XML erstellen, die gegen die XSD erfolgreich geprüft werden kann. Dann kannst Du 100% sicher sein, das Du diese Daten auch verstehst. Extrem praktisch.


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