Browse Source

+ Patch from Vincent Snijders to fix reading of entities

michael 20 years ago
parent
commit
57af5a1f8c
1 changed files with 12 additions and 7 deletions
  1. 12 7
      fcl/xml/xmlread.pp

+ 12 - 7
fcl/xml/xmlread.pp

@@ -1297,8 +1297,10 @@ end;
   predefined in XML: }
 
 procedure TXMLReader.ResolveEntities(RootNode: TDOMNode);
+var
+  Node, NextNode: TDOMNode;
 
-  procedure ReplaceEntityRef(EntityNode: TDOMNode; const Replacement: String);
+  procedure ReplaceEntityRef(EntityNode: TDOMNode; const Replacement: string);
   var
     PrevSibling, NextSibling: TDOMNode;
   begin
@@ -1310,6 +1312,8 @@ procedure TXMLReader.ResolveEntities(RootNode: TDOMNode);
       RootNode.RemoveChild(EntityNode);
       if Assigned(NextSibling) and (NextSibling.NodeType = TEXT_NODE) then
       begin
+        // next sibling is to be removed, so we can't use it anymore
+        NextNode := NextSibling.NextSibling;
         TDOMCharacterData(PrevSibling).AppendData(
         TDOMCharacterData(NextSibling).Data);
         RootNode.RemoveChild(NextSibling);
@@ -1323,13 +1327,11 @@ procedure TXMLReader.ResolveEntities(RootNode: TDOMNode);
         RootNode.ReplaceChild(Doc.CreateTextNode(Replacement), EntityNode);
   end;
 
-var
-  Node, NextSibling: TDOMNode;
 begin
   Node := RootNode.FirstChild;
   while Assigned(Node) do
   begin
-    NextSibling := Node.NextSibling;
+    NextNode := Node.NextSibling;
     if Node.NodeType = ENTITY_REFERENCE_NODE then
       if Node.NodeName = 'amp' then
         ReplaceEntityRef(Node, '&')
@@ -1341,7 +1343,7 @@ begin
         ReplaceEntityRef(Node, '<')
       else if Node.NodeName = 'quot' then
         ReplaceEntityRef(Node, '"');
-    Node := NextSibling;
+    Node := NextNode;
   end;
 end;
 
@@ -1389,8 +1391,8 @@ begin
     Reader := TXMLReader.Create;
     try
       Reader.ProcessXML(buf, AFilename);
-      ADoc := TXMLDocument(Reader.doc);
     finally
+      ADoc := TXMLDocument(Reader.doc);
       Reader.Free;
     end;
   finally
@@ -1563,7 +1565,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.16  2005-03-14 21:10:12  florian
+  Revision 1.17  2005-05-02 13:06:51  michael
+  + Patch from Vincent Snijders to fix reading of entities
+
+  Revision 1.16  2005/03/14 21:10:12  florian
     * adapated for the new widestring manager
 
   Revision 1.15  2005/02/14 17:13:18  peter