17. november 2010 - 07:39 Der er 13 kommentarer og
1 løsning

Fang XML Exception

Hej,

På min form bruger jeg Delphi's XMLDocument (XMLDoc).

Jeg ønsker at checke om de XML-filer jeg skal bruge har korrekt syntaks OG ikke indeholder "forbudte" tegn;

Har følgende kode (noget af den);

(* OpenDialog1 nedenfor masker selvfølgelig XML-filer *)

    ...
    XMLDoc.Active := False;
    XMLDoc.FileName := '';
    IF OPenDialog1.Execute then
      BEGIN
          XMLDoc.FileName := 
            OPenDialog1.FileName; 
            XMLDoc.Active := True;
      .....

      OSV...



Det fungerer på korrekt formatterede XML-filer (syntaks OK og ingen forbudte tegn ('<', '>', '&', ... osv ).

MEN :

Jeg får imidlertid også externt genererede filer med XML-forbudte tegn, hvor jeg ønsker at disse filer skal isoleres (til senere behandling): 

Min ide var at lade XMLDoc foretag dette check:

    XMLDoc.FileName := '';
    IF OPenDialog1.Execute then
      BEGIN
          XMLDoc.FileName := 
            OPenDialog1.FileName;
            TRY   
              XMLDoc.Active := True;
            EXCEPT
                ON """XML-whatever-ERROR""" DO
                  XMLFEJLHÅNDTERING;
 
            END;
          ..... 
//
// Kommer vi her er det gået godt --> fortsæt       
//       
            .....

XML-teksten fra file-n (-rne) lægges ind i en LISTBOKS, så jeg kunne lave en scanning for de forbudte XML-tegn, men det må kunne laves "the delphi way".

Det jeg mangler er den præcise syntaks for den EXCEPTION , som trigger når XML-parseren/fortolkeren møder disse fejl i teksten.
Har forgæves søgt i Delphi-hjælp, men har ikke fundet beskrivelsen for den Exception.

HJÆLP.

KRISTIAN
Avatar billede hrc Mester
17. november 2010 - 08:50 #1
Altså umiddelbart så kastes der en exception nedarvet fra Exception. Den kan du fange på denne måde:

type
  MyException = class(Exception);

try
except
  on e: MyException do
  begin
    ShowMessage(e.Message); // XML-fejlhåndtering.
  end;
  on e: Exception do
  begin
    ShowMessage('Der skete en fejl');
    raise; // reraise
  end;
end;

Er det det du søger efter? Du skal blot notere dig exceptionens navn og eventuelt undersøge om den indeholder mere end blot Exception. Ved opslag i f.eks. databaser er der som regel noget mere med.

var
  MyE: MyException;
try
except
  on e: MyException do
  begin
    MyE := e as MyException;
    if MyE.MinFejlkode = 233 then
      raise
    else
      ShowMessage(MyE.Message); // XML-fejlhåndtering.
  end;
  on e: Exception do
  begin
    ShowMessage('Der skete en fejl');
    raise; // reraise
  end;
end;
Avatar billede hrc Mester
17. november 2010 - 08:53 #2
Alternativt kan du generere et XML-skema og lade en af Delphis XML-komponenter validere filen. Den funktionalitet er jeg ret sikker på findes.
17. november 2010 - 10:20 #3
HEj,

Sorry to say:

NOPE,

det virker ikke.

Igen hvis jeg loader en perfekt formatteret XML-fil --> INGEN PROBLEMER.

Ved fejl ( en '>' anbragt tilfældigt i en ellers godkendt XML-fil) --> FEJL.

Den fanger ikke Exceptionen .

Her er jeg blank som en nyfødts blanke num---(censur) , så jeg takker for al den hjælp jeg kan få.

KRistian
Avatar billede hrc Mester
17. november 2010 - 10:34 #4
Dokumentationen påstår ellers at der fyres en EXMLDocError af ved fejl i indlæsningen - men det er måske kun hvis du har et XML-skema tilknyttet?

Er det muligt du kan koble XML-filen sammen med et skema?
Avatar billede hrc Mester
17. november 2010 - 10:48 #5
Jeg ved ikke hvor kønt dette her er, men hos mig fungerer det:

uses
  XMLDoc, XMLDom;

procedure TfrmMain.btnTestClick(Sender: TObject);
var
  Err: string;
begin
  if IsXMLLodable('test.xml',Err) then
    MessageDlg('OK!', mtInformation, [mbOK], 0)
  else
    MessageDlg(Err, mtError, [mbOK], 0);
end;

function TfrmMain.IsXMLLodable(const aFilename: string; var aError: string): boolean;
var
  XMLDoc: TXMLDocument;
begin
  aError := '';

  XMLDoc := TXMLDocument.Create(nil);
  try
    xmldoc.filename := aFilename;
    try
      xmldoc.active := true;
      result := true;
    except
      on e: EDOMParseError do
      begin
        aError := e.Message;
        result := false;
      end;
    end;
  finally
    XMLDoc.Free;
  end;
end;
Avatar billede hrc Mester
17. november 2010 - 10:54 #6
Tror dette her er den rigtige måde at skrive funktionen på (det er noget bøvl sådan TXMLDocument kan oprettes):

function TfrmMain.IsXMLLodable(const aFilename: string; var aError: string): boolean;
var
  IXMLDoc: IXMLDocument;
begin
  aError := '';
  try
    IXMLDoc := LoadXMLDocument(aFilename);
    try
      result := true;
    finally
      IXMLDoc := nil;
    end;
  except
    on e: EDOMParseError do
    begin
      aError := e.Message;
      result := false;
    end;
  end;
end;
17. november 2010 - 12:35 #7
HEJ

%¤%&%¤#¤%&&%#%& -- osv..

Har prøvet begge dine forsøg.

Igen fejlfri ved korrekt formattering

men siger:

Project XMLDOCintP.exe  (mit navn) raised Exception Class EDOMParseerror with message "Whitespace is not allowed at this location " - efterfulgt af et linieummer og "RUN TO CONTINUE" -

hvilket prgm'et ikke gør... ved fejl !

ved begge forsøg.

KR
Avatar billede hrc Mester
17. november 2010 - 14:27 #8
Æhh. Nu spørger jeg måske dumt, men har du kørt programmet fra Delphi eller fra en prompt?
Avatar billede hrc Mester
17. november 2010 - 14:43 #9
... og hvilken Delphi-version?
17. november 2010 - 16:37 #10
Hej,

Jeg kører det i D-7 (enterprise) versionen.

Det (skulle) køre(r) under Windoze .


Jeg kommer til at tænke på om det kan være en (eller flere) opsætninger i D7E som er skredet ?

Jeg er heller ikke så stærk i opsætningen af D-7.

(Problemet her , er at jobben SKAL  S P A R E  (en statsinstitution), så al undervisning, kurser etc. et suspenderet i 2010 (og sikkert også i 2011 og 2012 (suk og atter SUK) så jeg må læse tingene op selv. Og tid til det ? TJA ....

For slet ikke at tale om bøger og lære-materiale...(flere suk). )

Kan du henvise til LINKS omkring opsætning  ?

KR
Avatar billede js_delphi Nybegynder
17. november 2010 - 21:00 #11
Jeg bruger IXMLDocument, og "validerer" et aabnet dokument med try except. Det fungerer upaaklageligt.

...

XMLDoc := NewXMLDocument;
XMLDoc.Active := True;
try
  XMLDoc.LoadFromFile(OpenDialog1.FileName);

  //Kode

except
  MessageBox(Handle,'Error by opening configuration file','Error',MB_ICONERROR);
end;
17. november 2010 - 23:36 #12
Hej,

det er også det, som alle referencer heviser til, men af en eller anden grund fungerer det ikke hos mig...

En anden ting er, at jeg skal meget nordpå (Barnedåb i Vannvika (= Trondhjem, Norge))  de næste 4 dage (er hjemme igen sent søndag. Så jeg er uden Internet adgang, men jeg vil være på nettet igen mandag morgen.

KR
Avatar billede ibhe Novice
15. februar 2011 - 04:38 #13
Jeg ved ikke om dette hjælper dig, men der er føgende exceptions i xmldoc:
  SNotActive = 'No active document';
  SNodeNotFound = 'Node "%s" not found';
  SMissingNode = 'IDOMNode required';
  SNoAttributes = 'Attributes are not supported on this node type';
  SInvalidNodeType = 'Invalid node type';
  SMismatchedRegItems = 'Mismatched paramaters to RegisterChildNodes';
  SNotSingleTextNode = 'Element does not contain a single text node';
  SNoDOMParseOptions = 'DOM Implementation does not support IDOMParseOptions';
  SNotOnHostedNode = 'Invalid operation on a hosted node';
  SMissingItemTag = 'ItemTag property is not initialized';
  SNodeReadOnly = 'Node is readonly';
  SUnsupportedEncoding = 'Unsupported character encoding "%s", try using LoadFromFile';
  SNoRefresh = 'Refresh is only supported if the FileName or XML properties are set';
  SMissingFileName = 'FileName cannot be blank';
  SLine = 'Line';
  SUnknown = 'Unknown';

---------------
Man kan fange dem med en almindelig exception ala

  try
    if xmldoc.ChildNodes.Count>0 then {gør noget med xmldoc};
    except on e:exception do begin
      showmessage('fejl: '+e.Message);
    end
  end;

Du kan teste det ved at lave et nyt delphi program og lægge et xmldocument (navn:xmldoc) på siden og så skrive det ovenfor i en knap

Håber du kommer lidt videre
15. april 2011 - 17:17 #14
LUKKER SPM.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester