Browse Source

* Added NameTable property to TXMLReaderSettings
* Removed redundant ANameTable parameters from some TXMLTextReader constructors
* TDOMParser.ParseWithContext: fixed accessing the document (it may be the context node itself)

git-svn-id: trunk@20769 -

sergei 13 years ago
parent
commit
69ca1accde
1 changed files with 39 additions and 17 deletions
  1. 39 17
      packages/fcl-xml/src/xmlread.pp

+ 39 - 17
packages/fcl-xml/src/xmlread.pp

@@ -61,6 +61,7 @@ type
 
   TXMLReaderSettings = class(TObject)
   private
+    FNameTable: THashTable;
     FValidate: Boolean;
     FPreserveWhitespace: Boolean;
     FExpandEntities: Boolean;
@@ -74,6 +75,7 @@ type
     function GetCanonical: Boolean;
     procedure SetCanonical(aValue: Boolean);
   public
+    property NameTable: THashTable read FNameTable write FNameTable;
     property Validate: Boolean read FValidate write FValidate;
     property PreserveWhitespace: Boolean read FPreserveWhitespace write FPreserveWhitespace;
     property ExpandEntities: Boolean read FExpandEntities write FExpandEntities;
@@ -325,7 +327,7 @@ type
     procedure CleanAttrReadState;
     procedure SetEOFState;
     procedure SkipQuote(out Delim: WideChar; required: Boolean = True);
-    procedure Initialize(ASource: TXMLCharSource);
+    procedure SetSource(ASource: TXMLCharSource);
     procedure EntityToSource(AEntity: TEntityDecl; out Src: TXMLCharSource);
     function ContextPush(AEntity: TEntityDecl; DummySource: Boolean = False): Boolean;
     function ContextPop(Forced: Boolean = False): Boolean;
@@ -464,9 +466,10 @@ type
   public
     constructor Create(var AFile: Text; ANameTable: THashTable); overload;
     constructor Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable); overload;
+    constructor Create(AStream: TStream; const ABaseUri: XMLString; ASettings: TXMLReaderSettings); overload;
     constructor Create(ASrc: TXMLCharSource; AParent: TXMLTextReader); overload;
-    constructor Create(const uri: XMLString; ANameTable: THashTable; ASettings: TXMLReaderSettings); overload;
-    constructor Create(ASrc: TXMLInputSource; ANameTable: THashTable; ASettings: TXMLReaderSettings); overload;
+    constructor Create(const uri: XMLString; ASettings: TXMLReaderSettings); overload;
+    constructor Create(ASrc: TXMLInputSource; ASettings: TXMLReaderSettings); overload;
     destructor Destroy; override;
     procedure AfterConstruction; override;
     property OnEntity: TEntityEvent read FOnEntity write FOnEntity;
@@ -599,7 +602,8 @@ var
   ldr: TLoader;
 begin
   ADoc := TXMLDocument.Create;
-  Reader := TXMLTextReader.Create(Src, ADoc.Names, Options);
+  Options.NameTable := ADoc.Names;
+  Reader := TXMLTextReader.Create(Src, Options);
   try
     ldr.ProcessXML(ADoc, Reader);
   finally
@@ -613,7 +617,8 @@ var
   ldr: TLoader;
 begin
   ADoc := TXMLDocument.Create;
-  Reader := TXMLTextReader.Create(URI, ADoc.Names, Options);
+  Options.NameTable := ADoc.Names;
+  Reader := TXMLTextReader.Create(URI, Options);
   try
     ldr.ProcessXML(ADoc, Reader)
   finally
@@ -628,6 +633,7 @@ var
   node: TDOMNode;
   reader: TXMLTextReader;
   ldr: TLoader;
+  doc: TDOMDocument;
 begin
   if Action in [xaInsertBefore, xaInsertAfter, xaReplace] then
     node := Context.ParentNode
@@ -640,9 +646,15 @@ begin
   if not (node.NodeType in [ELEMENT_NODE, DOCUMENT_FRAGMENT_NODE]) then
     raise EDOMHierarchyRequest.Create('DOMParser.ParseWithContext');
 
-  reader := TXMLTextReader.Create(Src, Context.OwnerDocument.Names, Options);
+  if Context.NodeType = DOCUMENT_NODE then
+    doc := TDOMDocument(Context)
+  else
+    doc := Context.OwnerDocument;
+
+  Options.NameTable := doc.Names;
+  reader := TXMLTextReader.Create(Src, Options);
   try
-    Frag := Context.OwnerDocument.CreateDocumentFragment;
+    Frag := doc.CreateDocumentFragment;
     try
       ldr.ProcessFragment(Frag, reader);
       Result := Frag.FirstChild;
@@ -1116,13 +1128,12 @@ begin
   Result := Assigned(Source);
 end;
 
-procedure TXMLTextReader.Initialize(ASource: TXMLCharSource);
+procedure TXMLTextReader.SetSource(ASource: TXMLCharSource);
 begin
   ASource.FParent := FSource;
   FSource := ASource;
   FSource.FReader := Self;
   FSource.FStartNesting := FNesting;
-  FSource.Initialize;
 end;
 
 procedure TXMLTextReader.FatalError(Expected: WideChar);
@@ -1351,23 +1362,21 @@ begin
   FOnError := AValue.OnError;
 end;
 
-constructor TXMLTextReader.Create(ASrc: TXMLInputSource; ANameTable: THashTable; ASettings: TXMLReaderSettings);
+constructor TXMLTextReader.Create(ASrc: TXMLInputSource; ASettings: TXMLReaderSettings);
 var
   InputSrc: TXMLCharSource;
 begin
-  Create;
+  SetNametable(ASettings.NameTable);
   SetOptions(ASettings);
-  FNameTable := ANameTable;
   ConvertSource(ASrc, InputSrc);
   FSource := InputSrc;
   FSource.FReader := Self;
 end;
 
-constructor TXMLTextReader.Create(const uri: XMLString; ANameTable: THashTable; ASettings: TXMLReaderSettings);
+constructor TXMLTextReader.Create(const uri: XMLString; ASettings: TXMLReaderSettings);
 begin
-  Create;
+  SetNametable(ASettings.NameTable);
   SetOptions(ASettings);
-  FNameTable := ANameTable;
   if ResolveResource(uri, '', '', FSource) then
     FSource.FReader := Self
   else
@@ -1400,6 +1409,15 @@ begin
   FSource.FReader := Self;
 end;
 
+constructor TXMLTextReader.Create(AStream: TStream; const ABaseUri: XMLString; ASettings: TXMLReaderSettings); overload;
+begin
+  SetNametable(ASettings.NameTable);
+  SetOptions(ASettings);
+  FSource := TXMLStreamInputSource.Create(AStream, False);
+  FSource.SourceURI := ABaseUri;
+  FSource.FReader := Self;
+end;
+
 constructor TXMLTextReader.Create(ASrc: TXMLCharSource; AParent: TXMLTextReader);
 begin
   FNameTable := AParent.FNameTable;
@@ -1934,7 +1952,10 @@ begin
   end;
   Result := Assigned(Src);
   if Result then
-    Initialize(Src);
+  begin
+    SetSource(Src);
+    Src.Initialize;
+  end;
 end;
 
 function TXMLTextReader.ContextPop(Forced: Boolean): Boolean;
@@ -2327,7 +2348,8 @@ begin
   begin
     if ResolveResource(FDocType.FSystemID, FDocType.FPublicID, FSource.SourceURI, Src) then
     begin
-      Initialize(Src);
+      SetSource(Src);
+      Src.Initialize;
       try
         Src.Kind := skManualPop;
         ParseMarkupDecl;