AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi String Value prüfen auf XML Konformität
Thema durchsuchen
Ansicht
Themen-Optionen

String Value prüfen auf XML Konformität

Ein Thema von sirarcher · begonnen am 1. Feb 2008 · letzter Beitrag vom 14. Feb 2008
Antwort Antwort
sirarcher

Registriert seit: 7. Mär 2007
22 Beiträge
 
#1

String Value prüfen auf XML Konformität

  Alt 1. Feb 2008, 17:32
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:
Mein Text [b]FETT[/b] usw. Mein Text [b]<u>FETTUNTERSTRICHEN</u>[/b] usw. Nicht Konform:
Mein Text [b]FETT 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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

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

  Alt 1. Feb 2008, 17:50
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/>';
Andreas
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 1. Feb 2008, 17:51
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

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

  Alt 1. Feb 2008, 18:52
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...
  Mit Zitat antworten Zitat
sirarcher

Registriert seit: 7. Mär 2007
22 Beiträge
 
#5

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

  Alt 14. Feb 2008, 13:52
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], '<br />', '&#xA;');
    stlXmlFile.Strings[intCount] := objReplace.ReplaceWideStr(stlXmlFile.Strings[intCount], '<br>', '&#xA;');
    //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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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