+ Fixes from Sebastiam Guenther - more error-proof

This commit is contained in:
michael 1999-07-25 16:24:13 +00:00
parent 4c2cc46a25
commit 26580a676b
2 changed files with 97 additions and 55 deletions

View File

@ -68,15 +68,24 @@ begin
Reset(f, 1); Reset(f, 1);
{$I+} {$I+}
if IOResult = 0 then begin if IOResult = 0 then begin
doc := ReadXMLFile(f); try
ReadXMLFile(doc, f);
except
on e: EXMLReadError do
WriteLn(StdErr, 'Warning: XML config parsing error: ', e.Message);
end;
Close(f); Close(f);
doc.SetDocumentElement(TDOMElement(doc.FindNode('CONFIG'))); end;
end else begin
if doc = nil then
doc := TXMLDocument.Create; doc := TXMLDocument.Create;
cfg :=TDOMElement(doc.FindNode('CONFIG'));
if cfg = nil then begin
cfg := doc.CreateElement('CONFIG'); cfg := doc.CreateElement('CONFIG');
doc.AppendChild(cfg); doc.AppendChild(cfg);
doc.SetDocumentElement(cfg);
end; end;
doc.SetDocumentElement(cfg);
end; end;
destructor TXMLConfig.Destroy; destructor TXMLConfig.Destroy;
@ -182,7 +191,10 @@ end.
{ {
$Log$ $Log$
Revision 1.2 1999-07-09 21:05:50 michael Revision 1.3 1999-07-25 16:24:13 michael
+ Fixes from Sebastiam Guenther - more error-proof
Revision 1.2 1999/07/09 21:05:50 michael
+ fixes from Guenther Sebastian + fixes from Guenther Sebastian
Revision 1.1 1999/07/09 08:35:09 michael Revision 1.1 1999/07/09 08:35:09 michael

View File

@ -21,22 +21,31 @@ unit xmlread;
interface interface
uses classes, DOM; uses sysutils, classes, DOM;
function ReadXMLFile(const AFileName: String): TXMLDocument; type
function ReadXMLFile(var f: File): TXMLDocument;
function ReadXMLFile(var f: TStream): TXMLDocument;
function ReadDTDFile(const AFileName: String): TXMLDocument; EXMLReadError = class(Exception);
function ReadDTDFile(var f: File): TXMLDocument;
function ReadDTDFile(var f: TStream): TXMLDocument;
procedure ReadXMLFile(var ADoc: TXMLDocument; const AFilename: String);
procedure ReadXMLFile(var ADoc: TXMLDocument; var f: File);
procedure ReadXMLFile(var ADoc: TXMLDocument; var f: TStream);
procedure ReadXMLFile(var ADoc: TXMLDocument; var f: TStream;
const AFilename: String);
procedure ReadDTDFile(var ADoc: TXMLDocument; const AFilename: String);
procedure ReadDTDFile(var ADoc: TXMLDocument; var f: File);
procedure ReadDTDFile(var ADoc: TXMLDocument; var f: TStream);
procedure ReadDTDFile(var ADoc: TXMLDocument; var f: TStream;
const AFilename: String);
// ======================================================= // =======================================================
implementation implementation
uses sysutils; {$I filerec.inc}
const const
@ -54,8 +63,8 @@ type
TXMLReader = class TXMLReader = class
protected protected
doc: TXMLDocument;
buf, BufStart: PChar; buf, BufStart: PChar;
Filename: String;
procedure RaiseExc(descr: String); procedure RaiseExc(descr: String);
function SkipWhitespace: Boolean; function SkipWhitespace: Boolean;
@ -84,8 +93,9 @@ type
procedure ExpectExternalID; procedure ExpectExternalID;
function ParseEncodingDecl: String; // [80] function ParseEncodingDecl: String; // [80]
public public
function ProcessXML(ABuf: PChar): TXMLDocument; // [1] doc: TXMLDocument;
function ProcessDTD(ABuf: PChar): TXMLDocument; // ([29]) procedure ProcessXML(ABuf: PChar; AFilename: String); // [1]
procedure ProcessDTD(ABuf: PChar; AFilename: String); // ([29])
end; end;
@ -108,7 +118,7 @@ begin
Inc(apos); Inc(apos);
end; end;
raise Exception.Create('In XML reader (line ' + IntToStr(y) + ' pos ' + raise EXMLReadError.Create('In ' + Filename + ' (line ' + IntToStr(y) + ' pos ' +
IntToStr(x) + '): ' + descr); IntToStr(x) + '): ' + descr);
end; end;
@ -166,12 +176,13 @@ begin
end; end;
end; end;
function TXMLReader.ProcessXML(ABuf: PChar): TXMLDocument; // [1] procedure TXMLReader.ProcessXML(ABuf: PChar; AFilename: String); // [1]
var var
LastNodeBeforeDoc: TDOMNode; LastNodeBeforeDoc: TDOMNode;
begin begin
buf := ABuf; buf := ABuf;
BufStart := ABuf; BufStart := ABuf;
Filename := AFilename;
doc := TXMLDocument.Create; doc := TXMLDocument.Create;
ExpectProlog; ExpectProlog;
@ -186,8 +197,6 @@ begin
WriteLn(StrLen(buf), ' chars'); WriteLn(StrLen(buf), ' chars');
end; end;
} }
Result := doc;
end; end;
@ -622,10 +631,11 @@ begin
Result := True; Result := True;
end; end;
function TXMLReader.ProcessDTD(ABuf: PChar): TXMLDocument; procedure TXMLReader.ProcessDTD(ABuf: PChar; AFilename: String);
begin begin
buf := ABuf; buf := ABuf;
BufStart := ABuf; BufStart := ABuf;
Filename := AFilename;
doc := TXMLDocument.Create; doc := TXMLDocument.Create;
ParseMarkupDecl; ParseMarkupDecl;
@ -637,8 +647,6 @@ begin
WriteLn(StrLen(buf), ' chars'); WriteLn(StrLen(buf), ' chars');
end; end;
} }
Result := doc;
end; end;
function TXMLReader.ParseElement(AOwner: TDOMNode): Boolean; // [39] [40] [44] function TXMLReader.ParseElement(AOwner: TDOMNode): Boolean; // [39] [40] [44]
@ -850,102 +858,119 @@ begin
end; end;
function ReadXMLFile(var f: File): TXMLDocument; procedure ReadXMLFile(var ADoc: TXMLDocument; var f: File);
var var
reader: TXMLReader; reader: TXMLReader;
buf: PChar; buf: PChar;
BufSize: LongInt; BufSize: LongInt;
begin begin
ADoc := nil;
BufSize := FileSize(f) + 1; BufSize := FileSize(f) + 1;
if BufSize <= 1 then begin if BufSize <= 1 then exit;
Result := nil;
exit;
end;
GetMem(buf, BufSize); GetMem(buf, BufSize);
BlockRead(f, buf^, BufSize - 1); BlockRead(f, buf^, BufSize - 1);
buf[BufSize - 1] := #0; buf[BufSize - 1] := #0;
reader := TXMLReader.Create; reader := TXMLReader.Create;
Result := reader.ProcessXML(buf); reader.ProcessXML(buf, Filerec(f).name);
FreeMem(buf, BufSize); FreeMem(buf, BufSize);
ADoc := reader.doc;
reader.Free; reader.Free;
end; end;
function ReadXMLFile(var f: TStream): TXMLDocument; procedure ReadXMLFile(var ADoc: TXMLDocument; var f: TStream;
const AFilename: String);
var var
reader: TXMLReader; reader: TXMLReader;
buf: PChar; buf: PChar;
begin begin
if f.Size = 0 then begin ADoc := nil;
Result := nil; if f.Size = 0 then exit;
exit;
end;
GetMem(buf, f.Size + 1); GetMem(buf, f.Size + 1);
f.Read(buf^, f.Size); f.Read(buf^, f.Size);
buf[f.Size] := #0; buf[f.Size] := #0;
reader := TXMLReader.Create; reader := TXMLReader.Create;
Result := reader.ProcessXML(buf); reader.ProcessXML(buf, AFilename);
FreeMem(buf, f.Size + 1); FreeMem(buf, f.Size + 1);
ADoc := reader.doc;
reader.Free; reader.Free;
end; end;
function ReadXMLFile(const AFileName: String): TXMLDocument; procedure ReadXMLFile(var ADoc: TXMLDocument; var f: TStream);
begin
ReadXMLFile(ADoc, f, '<Stream>');
end;
procedure ReadXMLFile(var ADoc: TXMLDocument; const AFilename: String);
var var
stream: TFileStream; stream: TFileStream;
begin begin
stream := TFileStream.Create(AFileName, fmOpenRead); ADoc := nil;
Result := ReadXMLFile(stream); stream := TFileStream.Create(AFilename, fmOpenRead);
try
ReadXMLFile(ADoc, stream, AFilename);
finally
stream.Free; stream.Free;
end;
end; end;
function ReadDTDFile(var f: File): TXMLDocument; procedure ReadDTDFile(var ADoc: TXMLDocument; var f: File);
var var
reader: TXMLReader; reader: TXMLReader;
buf: PChar; buf: PChar;
BufSize: LongInt; BufSize: LongInt;
begin begin
ADoc := nil;
BufSize := FileSize(f) + 1; BufSize := FileSize(f) + 1;
if BufSize <= 1 then begin if BufSize <= 1 then exit;
Result := nil;
end;
GetMem(buf, BufSize + 1); GetMem(buf, BufSize + 1);
BlockRead(f, buf^, BufSize - 1); BlockRead(f, buf^, BufSize - 1);
buf[BufSize - 1] := #0; buf[BufSize - 1] := #0;
reader := TXMLReader.Create; reader := TXMLReader.Create;
Result := reader.ProcessDTD(buf); reader.ProcessDTD(buf, Filerec(f).name);
FreeMem(buf, BufSize); FreeMem(buf, BufSize);
ADoc := reader.doc;
reader.Free; reader.Free;
end; end;
function ReadDTDFile(var f: TStream): TXMLDocument; procedure ReadDTDFile(var ADoc: TXMLDocument; var f: TStream;
const AFilename: String);
var var
reader: TXMLReader; reader: TXMLReader;
buf: PChar; buf: PChar;
begin begin
if f.Size = 0 then begin ADoc := nil;
Result := nil; if f.Size = 0 then exit;
exit;
end;
GetMem(buf, f.Size + 1); GetMem(buf, f.Size + 1);
f.Read(buf^, f.Size); f.Read(buf^, f.Size);
buf[f.Size] := #0; buf[f.Size] := #0;
reader := TXMLReader.Create; reader := TXMLReader.Create;
Result := reader.ProcessDTD(buf); reader.ProcessDTD(buf, AFilename);
FreeMem(buf, f.Size + 1); FreeMem(buf, f.Size + 1);
ADoc := reader.doc;
reader.Free; reader.Free;
end; end;
function ReadDTDFile(const AFileName: String): TXMLDocument; procedure ReadDTDFile(var ADoc: TXMLDocument; var f: TStream);
begin
ReadDTDFile(ADoc, f, '<Stream>');
end;
procedure ReadDTDFile(var ADoc: TXMLDocument; const AFilename: String);
var var
stream: TFileStream; stream: TFileStream;
begin begin
stream := TFileStream.Create(AFileName, fmOpenRead); ADoc := nil;
Result := ReadDTDFile(stream); stream := TFileStream.Create(AFilename, fmOpenRead);
try
ReadDTDFile(ADoc, stream, AFilename);
finally
stream.Free; stream.Free;
end;
end; end;
@ -954,7 +979,10 @@ end.
{ {
$Log$ $Log$
Revision 1.4 1999-07-11 20:20:12 michael Revision 1.5 1999-07-25 16:24:14 michael
+ Fixes from Sebastiam Guenther - more error-proof
Revision 1.4 1999/07/11 20:20:12 michael
+ Fixes from Sebastian Guenther + Fixes from Sebastian Guenther
Revision 1.3 1999/07/09 21:05:51 michael Revision 1.3 1999/07/09 21:05:51 michael
@ -967,3 +995,5 @@ end.
+ Initial implementation by Sebastian Guenther + Initial implementation by Sebastian Guenther
} }
--------------ECFEA19D0E6E5FF5CDAF6681--)