![]() |
String Value prüfen auf XML Konformität
Guten Abend,
ich habe einige Zeit nun Probiert etwas zu finden, aber irgendwie bin ich anscheinend zu blind. *. Ich lese aus einer Datenbank einen Text aus, welcher vorher von einem User eingegeben wurde. Die User verwenden dort auch "HTML-Tags" (zB: ) *. Nun mein Problem. Ich möchte einen Text, welchen ich auf einer Variable [von DB ausgelesen] habe (type=string), so prüfen (parsen), das ich 100% sichergestellt habe das er XML konform ist. Konform:
XML-Code:
Mein Text [b]FETT[/b] usw.
XML-Code:
Nicht Konform:
Mein Text [b]<u>FETTUNTERSTRICHEN</u>[/b] usw.
XML-Code:
Mein Text [b]FETT
XML-Code:
Wenn er nicht konform ist, möchte ich dem User eine Meldung bringen.
Mein Text [b]<u>FETTUNTERSTRICHEN[/b]</u> usw.
Danke für eure Antworten bzw. die Hilfe! PS: XML ist ja sehr empfindlich mit solchen Tags. Ich brauche sie auch noch um in einem PDF (welches ich aus dem XML erzeuge) die Texte zu formatieren. |
Re: String Value prüfen auf XML Konformität
Zitat:
Allerdings muss der Text nicht nur well-formed sein, sondern auch mit einer xml-processinginstruction beginnen und nur einen Wurzelknoten haben! Die xml-processinginstruction und den Wurzelknoten könntest du auch im Programm einfügen:
Delphi-Quellcode:
xml := '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'+
'<Rootnode>'+dertext+'<Rootnode/>'; |
Re: String Value prüfen auf XML Konformität
Hmm,
also ich würde den ganzen String durchgehen, und alle auftauchenden, öffnenden Tags an ein Array anhängen. Bei einem schließenden tag wird dann geprüft, ob der Typ mit dem letzten Element im Array übereinstimmt, wenn nein, ist es nicht XML-konform. Dann wird das Tag wieder vom Stapel entfernt. Am Ende prüfst du dann noch, ob das Array leer ist, also alle Tags geschlossen wurden. Tags wie <... /> kannst du ja einfach überspringen. |
Re: String Value prüfen auf XML Konformität
Ich frage mich, warum du diese Prüfung machen müsstest? Der Text sind Daten und werden somit an einen Knoten als Wert weiter gegeben. Dabei hat die XML Bibliothek dafür zu sorgen, dass die eingehenden Daten entpsrechend escaped werden (also [b] -> <b>) und somit hat der Parser auch kein Problem. Die XML Bibliothek stellt sich schliesslich nicht selber ein Bein. Beim einlesen einer solchen Datei wandelt die Bibliothek beim Zugriff auf den Knotenwert alles wieder zurück und es erscheint der Originale Inhalt der beim Schreiben dem Knotenwert zugewiesen wurde...
|
Re: String Value prüfen auf XML Konformität
Zitat:
ich habe es nun mit dem Parsen mittels XML umgesetzt:
Delphi-Quellcode:
vorher habe ich alle schon escaped Daten zurückgesetzt. var xmlDoc: IDOMDocument; begin try xmlDoc := LoadXMLDocument(strFileName).DOMDocument; except on e: Exception do begin //Ausgabe bzw. Weiterverarbeitung von: e.Message ... Hintergrund war/ist, das die User gewisse Tags in einem Programm verwenden dürfen (html tags) zur Darstellung im Firmeninternen Intranet. Mittels diesen Daten werden dann aber auch PDF's generiert wo der Text auch dort so Formatiert dargestellt wird. Nur beim PDF erzeugen brauche ich ein sauberes XML File, im Intranet ist es dem Browser (blöd gesagt) egal, der mache keine Probleme. Aber somit kann ich das ganze XML prüfen. Danke nochmals fürn tipp, hätte selber daran denken können/sollen. PS: Mit folgendem Code wandel ich vorher die Zeichen (welche zugelassen sind) zurück:
Delphi-Quellcode:
var
stlXmlFile: TStringList; intCount: integer; strMeldungsText: string; xmlDoc: IDOMDocument; begin //XML DATEN PRÜFEN (EIGENE KLASSE MACHEN) stlXmlFile := TStringList.Create; stlXmlFile.LoadFromFile(strFileName); for intCount := 0 to stlXmlFile.Count -1 do begin //BR stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '<br />', '
'); stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '<br>', '
'); //FETT stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '<b>', '[b]'); stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '</b>', '[/b]'); //UNTERSTRICHEN stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '<u>', '<u>'); stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '</u>', '</u>'); //KURSIV stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '<i>', '[i]'); stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '</i>', '[/i]'); //LEERZEICHEN stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '%SPACECHARACTER%', '*'); end; stlXmlFile.SaveToFile(strFileName); try xmlDoc := LoadXMLDocument(strFileName).DOMDocument; except on e: Exception do begin //Wenn keine Werte zurückkommen muss das Programm beendet werden. strMeldungsText := '<FONT face="Arial"><FONT size="18">' + '[b]XML Check (Custom formating tag''s)[/b]</FONT>' + ' ' + '<FONT size="10">' + '<FONT color="#FF0000">[B]<textarea>' + e.Message + '</textarea>[/B]</FONT>' + ' ' + 'Please contact your key user or IT adminstrator.' + '</FONT></FONT>'; Main.ShowWarningWindow(strMeldungsText); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz