Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   XML aus DBmemo überprüfen (https://www.delphipraxis.net/173153-xml-aus-dbmemo-ueberpruefen.html)

bernhard_LA 9. Feb 2013 17:51

Datenbank: MSSQL • Version: 2008 • Zugriff über: ADO

XML aus DBmemo überprüfen
 
ich speichere eine XML Datei in einem DBMEMO Feld. Die Anzeige in einem TDBMEMP bereitet keine Problem. (weil sehr einfach :-) )
Wenn ich den XML String an eine TWebbrowser Komponenten weiterleite bekomme ich eine AV wenn der String leer ist oder eine nicht gültige XML Datei enthält.

Was ist der einfachste Weg den Inhalt aus dem DBMemo Feld auf seine Gültigkeit zu überprüfen ?

Bummi 9. Feb 2013 19:24

AW: XML aus DBmemo überprüfen
 
Da ich gerade kein Blob mit XML zur Hand habe, habe ich es mit mit einem Filestream, statt eines Blobstreams, simuliert, vielleicht kannst Du damit was anfangen, weiterbasteln ...?

Delphi-Quellcode:
unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc, ComCtrls;

type
  TForm5 = class(TForm)
    x: TXMLDocument;
    Button1: TButton;
    Button2: TButton;
    TreeView1: TTreeView;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}




Function GetNodeText(n:IXMLNode;forceText:Boolean=true;NeedsSep:Boolean=true):String;
begin
  if ForceText then
    begin
        try
           Result := n.Text
        except
        end;
    end
   else
      begin
        if n.IsTextElement then Result := n.Text
        else Result :='';
      end;
   if NeedsSep and (Length(Result)>0) then Result := ' : ' + Result;

end;


Function Wrapped(const s:String):String;
begin
  if Length(s)>0 then Result := ' ('+s+')' else Result := s;

end;

Function GetKommaIfNeeded(Const Exist:String):String;
begin
  if length(Exist)>0 then Result := ', ' else Result := '';

end;

Function Translated(Const instr:String;Translate:Boolean):String;
begin
  Result := instr;
end;

Procedure  ParseNodes(n:IXMLNode;tn:TTreeNode;Dest:TTreeView;Translate:Boolean);
var
 i,j:Integer;
 an:TTreeNode;
 nodetext,att:String;
begin
  if Not (Assigned(n) and Assigned(Dest)) then EXIT;
  For i := 0 to n.ChildNodes.Count - 1 do
    begin
    att :='';
    for j := 0 to n.ChildNodes[i].AttributeNodes.Count - 1 do
        att := Att + GetKommaIfNeeded(Att)+ Translated(n.ChildNodes[i].AttributeNodes[j].LocalName,Translate) + '='+ n.ChildNodes[i].Attributes[n.ChildNodes[i].AttributeNodes[j].LocalName] ;
    if Length(n.ChildNodes[i].LocalName)>0 then
        begin
          nodetext := Translated(n.ChildNodes[i].LocalName,Translate);
          an := Dest.Items.AddChild(tn, nodetext + GetNodeText(n.ChildNodes[i],false,Length(nodetext)>0) + Wrapped(att));
          ParseNodes(n.ChildNodes[i],an,dest,translate);
        end;
    end;
end;


procedure TForm5.Button2Click(Sender: TObject);
var
 i:Integer;
 fs:TFileStream;
begin
//  x.XML.LoadFromFile('C:\temp\test.xml');
  fs := TFileStream.Create('C:\temp\test.xml',fmOpenRead);
  fs.Position := 0;
  try
  x.XML.LoadFromStream(fs);
  finally
    fs.Free;
  end;
  x.Active := true;
  ParseNodes(x.DocumentElement,nil,Treeview1,true);
end;

bernhard_LA 9. Feb 2013 21:18

AW: XML aus DBmemo überprüfen
 
danke für den Code, hätte gedacht TXMLDokument hat schon eine eigene Funktion zum Überprüfen ob der XML Inhalt korrekt ist

Volker Z. 9. Feb 2013 22:38

AW: XML aus DBmemo überprüfen
 
Hallo,

Zitat:

hätte gedacht TXMLDokument hat schon eine eigene Funktion zum Überprüfen ob der XML Inhalt korrekt ist
Schau mal nach TXMLDocument.ParseOptions. Mit poValidateOnParse in die Menge wird beim Parsen eine Exception geworfen, wenn das XML nicht passt.

Gruß


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