* Bugfixes: In some cases the DOM node tree was invalid

* Simplifications
* Minor optical improvements
This commit is contained in:
sg 2000-05-04 18:24:22 +00:00
parent 40f1da8f8e
commit bab6ab93b6
2 changed files with 74 additions and 37 deletions

View File

@ -703,8 +703,10 @@ var
child: TDOMNode;
begin
child := FirstChild;
while Assigned(child) do begin
if child.NodeName = ANodeName then begin
while Assigned(child) do
begin
if child.NodeName = ANodeName then
begin
Result := child;
exit;
end;
@ -729,7 +731,8 @@ var
child, next: TDOMNode;
begin
child := FirstChild;
while Assigned(child) do begin
while Assigned(child) do
begin
next := child.NextSibling;
child.Free;
child := next;
@ -742,9 +745,12 @@ function TDOMNode_WithChildren.InsertBefore(NewChild, RefChild: TDOMNode):
var
i: Integer;
begin
if not Assigned(RefChild) then begin
Result := NewChild;
if not Assigned(RefChild) then
begin
AppendChild(NewChild);
exit(NewChild);
exit;
end;
if NewChild.FOwnerDocument <> FOwnerDocument then
@ -763,8 +769,7 @@ begin
RefChild.FPreviousSibling.FNextSibling := NewChild;
RefChild.FPreviousSibling := NewChild;
Result := NewChild;
NewChild.FParentNode := Self;
end;
function TDOMNode_WithChildren.ReplaceChild(NewChild, OldChild: TDOMNode):
@ -788,7 +793,7 @@ begin
OldChild.FPreviousSibling.FNextSibling := OldChild.FNextSibling;
if OldChild = FLastChild then
FLastChild := nil
FLastChild := FLastChild.FPreviousSibling
else
OldChild.FNextSibling.FPreviousSibling := OldChild.FPreviousSibling;
@ -797,16 +802,17 @@ end;
function TDOMNode_WithChildren.AppendChild(NewChild: TDOMNode): TDOMNode;
var
parent: TDOMNode;
Parent: TDOMNode;
begin
if NewChild.FOwnerDocument <> FOwnerDocument then
raise EDOMWrongDocument.Create('NodeWC.AppendChild');
parent := Self;
while Assigned(parent) do begin
if parent = NewChild then
Parent := Self;
while Assigned(Parent) do
begin
if Parent = NewChild then
raise EDOMHierarchyRequest.Create('NodeWC.AppendChild (cycle in tree)');
parent := parent.ParentNode;
Parent := Parent.ParentNode;
end;
if NewChild.FParentNode = Self then
@ -815,7 +821,8 @@ begin
if NewChild.NodeType = DOCUMENT_FRAGMENT_NODE then
raise EDOMNotSupported.Create('NodeWC.AppendChild for DocumentFragments')
else begin
if Assigned(FFirstChild) then begin
if Assigned(FFirstChild) then
begin
FLastChild.FNextSibling := NewChild;
NewChild.FPreviousSibling := FLastChild;
end else
@ -836,7 +843,8 @@ var
node: TDOMNode;
begin
node := FirstChild;
while Assigned(node) do begin
while Assigned(node) do
begin
ACopy.AppendChild(node.CloneNode(True, ACloneOwner));
node := node.NextSibling;
end;
@ -861,7 +869,8 @@ var
begin
Result := 0;
child := node.FirstChild;
while Assigned(child) do begin
while Assigned(child) do
begin
if (not UseFilter) or (child.NodeName = filter) then
Inc(Result);
child := child.NextSibling;
@ -873,10 +882,13 @@ var
child: TDOMNode;
begin
Result := nil;
if index < 0 then exit;
if index < 0 then
exit;
child := node.FirstChild;
while Assigned(child) do begin
if index = 0 then begin
while Assigned(child) do
begin
if index = 0 then
begin
Result := child;
break;
end;
@ -929,14 +941,16 @@ begin
if arg.FOwnerDocument <> OwnerDocument then
raise EDOMWrongDocument.Create('NamedNodeMap.SetNamedItem');
if arg.NodeType = ATTRIBUTE_NODE then begin
if arg.NodeType = ATTRIBUTE_NODE then
begin
if Assigned(TDOMAttr(arg).AttrOwner) then
raise EDOMInUseAttribute.Create('NamedNodeMap.SetNamedItem');
TDOMAttr(arg).AttrOwner := Self;
end;
for i := 0 to Count - 1 do
if Item[i].NodeName = arg.NodeName then begin
if Item[i].NodeName = arg.NodeName then
begin
Result := Item[i];
Item[i] := arg;
exit;
@ -950,7 +964,8 @@ var
i: Integer;
begin
for i := 0 to Count - 1 do
if Item[i].NodeName = name then begin
if Item[i].NodeName = name then
begin
Result := Item[i];
Result.FParentNode := nil;
exit;
@ -1059,8 +1074,10 @@ var
node: TDOMNode;
begin
node := FFirstChild;
while Assigned(node) do begin
if node.FNodeType = ELEMENT_NODE then begin
while Assigned(node) do
begin
if node.FNodeType = ELEMENT_NODE then
begin
Result := TDOMElement(node);
exit;
end;
@ -1175,9 +1192,11 @@ var
child: TDOMNode;
begin
SetLength(Result, 0);
if Assigned(FFirstChild) then begin
if Assigned(FFirstChild) then
begin
child := FFirstChild;
while Assigned(child) do begin
while Assigned(child) do
begin
if child.NodeType = ENTITY_REFERENCE_NODE then
Result := Result + '&' + child.NodeName + ';'
else
@ -1246,7 +1265,8 @@ var
i: Integer;
begin
for i := 0 to FAttributes.Count - 1 do
if FAttributes.Item[i].NodeName = name then begin
if FAttributes.Item[i].NodeName = name then
begin
Result := FAttributes.Item[i].NodeValue;
exit;
end;
@ -1259,7 +1279,8 @@ var
attr: TDOMAttr;
begin
for i := 0 to FAttributes.Count - 1 do
if FAttributes.Item[i].NodeName = name then begin
if FAttributes.Item[i].NodeName = name then
begin
FAttributes.Item[i].NodeValue := value;
exit;
end;
@ -1274,7 +1295,8 @@ var
i: Integer;
begin
for i := 0 to FAttributes.Count - 1 do
if FAttributes.Item[i].NodeName = name then begin
if FAttributes.Item[i].NodeName = name then
begin
FAttributes.Delete(i);
FAttributes.Item[i].Free;
exit;
@ -1308,7 +1330,8 @@ var
i: Integer;
node: TDOMNode;
begin
for i := 0 to FAttributes.Count - 1 do begin
for i := 0 to FAttributes.Count - 1 do
begin
node := FAttributes.Item[i];
if node = OldAttr then begin
FAttributes.Delete(i);
@ -1466,7 +1489,12 @@ end.
{
$Log$
Revision 1.13 2000-04-20 14:15:45 sg
Revision 1.14 2000-05-04 18:24:22 sg
* Bugfixes: In some cases the DOM node tree was invalid
* Simplifications
* Minor optical improvements
Revision 1.13 2000/04/20 14:15:45 sg
* Minor bugfixes
* Started support for DOM level 2

View File

@ -165,24 +165,28 @@ var
begin
node := doc.DocumentElement;
path := APath;
while True do begin
while True do
begin
i := Pos('/', path);
if i = 0 then break;
if i = 0 then
break;
name := Copy(path, 1, i - 1);
path := Copy(path, i + 1, Length(path));
subnode := node.FindNode(name);
if not Assigned(subnode) then begin
if not Assigned(subnode) then
begin
subnode := doc.CreateElement(name);
node.AppendChild(subnode);
end;
node := subnode;
end;
attr := node.Attributes.GetNamedItem(path);
TDOMElement(node).SetAttribute(path, AValue);
{ attr := node.Attributes.GetNamedItem(path);
if not Assigned(attr) then begin
attr := doc.CreateAttribute(path);
node.Attributes.SetNamedItem(attr);
end;
attr.NodeValue := AValue;
attr.NodeValue := AValue;}
end;
procedure TXMLConfig.SetValue(const APath: String; AValue: Integer);
@ -204,7 +208,12 @@ end.
{
$Log$
Revision 1.9 2000-02-13 10:03:31 sg
Revision 1.10 2000-05-04 18:24:22 sg
* Bugfixes: In some cases the DOM node tree was invalid
* Simplifications
* Minor optical improvements
Revision 1.9 2000/02/13 10:03:31 sg
* Hopefully final fix for TDOMDocument.DocumentElement:
- Reading this property always delivers the first element in the document
- Removed SetDocumentElement. Use "AppendChild" or one of the other