* xmlread.pp, changed constructor using TXMLCharSource into two constructors using TStream and Text, in order to simplify the upcoming public usage of this class.

git-svn-id: trunk@20698 -
This commit is contained in:
sergei 2012-04-03 18:02:27 +00:00
parent a1f9055978
commit 69802878c6

View File

@ -260,7 +260,7 @@ type
TCheckNameFlags = set of (cnOptional, cnToken); TCheckNameFlags = set of (cnOptional, cnToken);
TXMLToken = (xtNone, xtEOF, xtText, xtWhitespace, xtElement, xtEndElement, TXMLToken = (xtNone, xtEOF, xtText, xtElement, xtEndElement,
xtCDSect, xtComment, xtPI, xtDoctype, xtEntity, xtEntityEnd, xtPopElement, xtCDSect, xtComment, xtPI, xtDoctype, xtEntity, xtEntityEnd, xtPopElement,
xtPopEmptyElement, xtPushElement, xtPushEntity, xtPopEntity, xtFakeLF); xtPopEmptyElement, xtPushElement, xtPushEntity, xtPopEntity, xtFakeLF);
@ -457,9 +457,11 @@ type
procedure DTDReloadHook; procedure DTDReloadHook;
procedure ConvertSource(SrcIn: TXMLInputSource; out SrcOut: TXMLCharSource); procedure ConvertSource(SrcIn: TXMLInputSource; out SrcOut: TXMLCharSource);
procedure SetOptions(AParser: TDOMParser); procedure SetOptions(AParser: TDOMParser);
procedure SetNametable(ANameTable: THashTable);
public public
constructor Create; overload; constructor Create; overload;
constructor Create(ASrc: TXMLCharSource; ANameTable: THashTable); overload; constructor Create(var AFile: Text; ANameTable: THashTable); overload;
constructor Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable); overload;
constructor Create(ASrc: TXMLCharSource; AParent: TXMLTextReader); overload; constructor Create(ASrc: TXMLCharSource; AParent: TXMLTextReader); overload;
constructor Create(const uri: XMLString; ANameTable: THashTable; AParser: TDOMParser); overload; constructor Create(const uri: XMLString; ANameTable: THashTable; AParser: TDOMParser); overload;
constructor Create(ASrc: TXMLInputSource; ANameTable: THashTable; AParser: TDOMParser); overload; constructor Create(ASrc: TXMLInputSource; ANameTable: THashTable; AParser: TDOMParser); overload;
@ -1339,8 +1341,6 @@ begin
Create; Create;
SetOptions(AParser); SetOptions(AParser);
FNameTable := ANameTable; FNameTable := ANameTable;
{ TODO: should not open file in ResolveResource, but do it when Read() is called
for the first time }
if ResolveResource(uri, '', '', FSource) then if ResolveResource(uri, '', '', FSource) then
FSource.FReader := Self FSource.FReader := Self
else else
@ -1348,7 +1348,7 @@ begin
end; end;
constructor TXMLTextReader.Create(ASrc: TXMLCharSource; ANameTable: THashTable); procedure TXMLTextReader.SetNametable(ANameTable: THashTable);
begin begin
if ANameTable = nil then if ANameTable = nil then
begin begin
@ -1356,14 +1356,31 @@ begin
FNameTableOwned := True; FNameTableOwned := True;
end; end;
FNameTable := ANameTable; FNameTable := ANameTable;
end;
constructor TXMLTextReader.Create(var AFile: Text; ANameTable: THashTable);
begin
SetNametable(ANameTable);
Create; Create;
FSource := ASrc; FSource := TXMLFileInputSource.Create(AFile);
FSource.FReader := Self;
end;
constructor TXMLTextReader.Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable);
begin
SetNametable(ANameTable);
Create;
FSource := TXMLStreamInputSource.Create(AStream, False);
FSource.SourceURI := ABaseUri;
FSource.FReader := Self; FSource.FReader := Self;
end; end;
constructor TXMLTextReader.Create(ASrc: TXMLCharSource; AParent: TXMLTextReader); constructor TXMLTextReader.Create(ASrc: TXMLCharSource; AParent: TXMLTextReader);
begin begin
Create(ASrc, AParent.FNameTable); FNameTable := AParent.FNameTable;
Create;
FSource := ASrc;
FSource.FReader := Self;
SetOptions(AParent.FCtrl); SetOptions(AParent.FCtrl);
end; end;
@ -1487,7 +1504,8 @@ var
begin begin
if reader.ReadState = rsInitial then if reader.ReadState = rsInitial then
begin begin
reader.Read; if not reader.Read then
Exit;
if cursor is TDOMNode_TopLevel then if cursor is TDOMNode_TopLevel then
begin begin
if reader.FSource.FXMLVersion <> xmlVersionUnknown then if reader.FSource.FXMLVersion <> xmlVersionUnknown then
@ -4280,12 +4298,10 @@ end;
procedure ReadXMLFile(out ADoc: TXMLDocument; var f: Text); procedure ReadXMLFile(out ADoc: TXMLDocument; var f: Text);
var var
Reader: TXMLTextReader; Reader: TXMLTextReader;
Src: TXMLCharSource;
ldr: TLoader; ldr: TLoader;
begin begin
ADoc := TXMLDocument.Create; ADoc := TXMLDocument.Create;
Src := TXMLFileInputSource.Create(f); Reader := TXMLTextReader.Create(f, ADoc.Names);
Reader := TXMLTextReader.Create(Src, ADoc.Names);
try try
ldr.ProcessXML(ADoc,Reader); ldr.ProcessXML(ADoc,Reader);
finally finally
@ -4296,13 +4312,10 @@ end;
procedure ReadXMLFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String); procedure ReadXMLFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String);
var var
Reader: TXMLTextReader; Reader: TXMLTextReader;
Src: TXMLCharSource;
ldr: TLoader; ldr: TLoader;
begin begin
ADoc := TXMLDocument.Create; ADoc := TXMLDocument.Create;
Src := TXMLStreamInputSource.Create(f, False); Reader := TXMLTextReader.Create(f, ABaseURI, ADoc.Names);
Src.SourceURI := ABaseURI;
Reader := TXMLTextReader.Create(Src, ADoc.Names);
try try
ldr.ProcessXML(ADoc, Reader); ldr.ProcessXML(ADoc, Reader);
finally finally
@ -4331,11 +4344,9 @@ end;
procedure ReadXMLFragment(AParentNode: TDOMNode; var f: Text); procedure ReadXMLFragment(AParentNode: TDOMNode; var f: Text);
var var
Reader: TXMLTextReader; Reader: TXMLTextReader;
Src: TXMLCharSource;
ldr: TLoader; ldr: TLoader;
begin begin
Src := TXMLFileInputSource.Create(f); Reader := TXMLTextReader.Create(f, AParentNode.OwnerDocument.Names);
Reader := TXMLTextReader.Create(Src, AParentNode.OwnerDocument.Names);
try try
ldr.ProcessFragment(AParentNode, Reader); ldr.ProcessFragment(AParentNode, Reader);
finally finally
@ -4346,12 +4357,9 @@ end;
procedure ReadXMLFragment(AParentNode: TDOMNode; f: TStream; const ABaseURI: String); procedure ReadXMLFragment(AParentNode: TDOMNode; f: TStream; const ABaseURI: String);
var var
Reader: TXMLTextReader; Reader: TXMLTextReader;
Src: TXMLCharSource;
ldr: TLoader; ldr: TLoader;
begin begin
Src := TXMLStreamInputSource.Create(f, False); Reader := TXMLTextReader.Create(f, ABaseURI, AParentNode.OwnerDocument.Names);
Src.SourceURI := ABaseURI;
Reader := TXMLTextReader.Create(Src, AParentNode.OwnerDocument.Names);
try try
ldr.ProcessFragment(AParentNode, Reader); ldr.ProcessFragment(AParentNode, Reader);
finally finally
@ -4380,12 +4388,10 @@ end;
procedure ReadDTDFile(out ADoc: TXMLDocument; var f: Text); procedure ReadDTDFile(out ADoc: TXMLDocument; var f: Text);
var var
Reader: TXMLTextReader; Reader: TXMLTextReader;
Src: TXMLCharSource;
ldr: TLoader; ldr: TLoader;
begin begin
ADoc := TXMLDocument.Create; ADoc := TXMLDocument.Create;
Src := TXMLFileInputSource.Create(f); Reader := TXMLTextReader.Create(f, ADoc.Names);
Reader := TXMLTextReader.Create(Src, ADoc.Names);
try try
ldr.ProcessDTD(ADoc,Reader); ldr.ProcessDTD(ADoc,Reader);
finally finally
@ -4400,9 +4406,7 @@ var
ldr: TLoader; ldr: TLoader;
begin begin
ADoc := TXMLDocument.Create; ADoc := TXMLDocument.Create;
Src := TXMLStreamInputSource.Create(f, False); Reader := TXMLTextReader.Create(f, ABaseURI, ADoc.Names);
Src.SourceURI := ABaseURI;
Reader := TXMLTextReader.Create(Src, ADoc.Names);
try try
ldr.ProcessDTD(ADoc,Reader); ldr.ProcessDTD(ADoc,Reader);
finally finally