+ Patch from Vincent Snijders to fix reading of entities

This commit is contained in:
michael 2005-05-02 13:06:51 +00:00
parent d955da19dd
commit 57af5a1f8c

View File

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