Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi String Value prüfen auf XML Konformität (https://www.delphipraxis.net/107752-string-value-pruefen-auf-xml-konformitaet.html)

sirarcher 1. Feb 2008 16:32


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:
Mein Text [b]<u>FETTUNTERSTRICHEN</u>[/b] usw.
Nicht Konform:
XML-Code:
Mein Text [b]FETT
XML-Code:
Mein Text [b]<u>FETTUNTERSTRICHEN[/b]</u> usw.
Wenn er nicht konform ist, möchte ich dem User eine Meldung bringen.

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.

shmia 1. Feb 2008 16:50

Re: String Value prüfen auf XML Konformität
 
Zitat:

Zitat von sirarcher
...so prüfen (parsen), das ich 100% sichergestellt habe das er XML konform ist.

Dann müsstest du den Text nur einem XML-Parser (z.B. MSXML) zum Fressen vorlegen.
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/>';

Namenloser 1. Feb 2008 16:51

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.

Muetze1 1. Feb 2008 17:52

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] -> &lt;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...

sirarcher 14. Feb 2008 12:52

Re: String Value prüfen auf XML Konformität
 
Zitat:

Zitat von Muetze1
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] -> &lt;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...

Hallo,

ich habe es nun mit dem Parsen mittels XML umgesetzt:

Delphi-Quellcode:
 
var
  xmlDoc: IDOMDocument;
begin
  try
    xmlDoc := LoadXMLDocument(strFileName).DOMDocument;
  except
    on e: Exception do begin
    //Ausgabe bzw. Weiterverarbeitung von: e.Message
  ...
vorher habe ich alle schon escaped Daten zurückgesetzt.

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], '&lt;br /&gt;', '&#xA;');
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '&lt;br&gt;', '&#xA;');
    //FETT
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '&lt;b&gt;', '[b]');
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '&lt;/b&gt;', '[/b]');
    //UNTERSTRICHEN
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '&lt;u&gt;', '<u>');
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '&lt;/u&gt;', '</u>');
    //KURSIV
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '&lt;i&gt;', '[i]');
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '&lt;/i&gt;', '[/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