@geskill: kommst auch gleich dran
@Medium:
die 1 vor die 3 verschieben
Delphi-Quellcode:
n :=
XML.RootNode.Nodes['
#Element>ID=1'];
f :=
XML.RootNode.Nodes['
#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f, True);
oder die 1 ausschneiden und vor der 3 wieder einfügen
Delphi-Quellcode:
n :=
XML.RootNode.Nodes.Remove('
#Element>ID=1');
f :=
XML.RootNode.Nodes['
#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f, True);
Ich würde aber Ersteres bevorzugen, denn falls was beim Einfügen schief geht (
Exception), dann würde f wild in der Gegend rumliegen (Speicherleck).
bzw, die 1 hinter die 3 verschieben
Delphi-Quellcode:
n :=
XML.RootNode.Nodes['
#Element>ID=1'];
f :=
XML.RootNode.Nodes['
#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f);
oder die 1 ausschneiden und nach der 3 wieder einfügen
Delphi-Quellcode:
n :=
XML.RootNode.Nodes.Remove('
#Element>ID=1');
f :=
XML.RootNode.Nodes['
#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f);
Nun aber noch 2 kleine Fehlerkorrekturen:
- In TXMLNodeList.Remove das "not" entfernen
- und nach dem Insert waren wirklich ein paar Zeiger fehlerhaft
Delphi-Quellcode:
Function TXMLNodeList.Insert(Node, RNode: TXMLNode; previousR: Boolean = False): TXMLNode;
Begin
If not (Node is TXMLNode) Then
Raise EXMLException.Create(ClassType, 'Insert', @SInvalidNode);
If (Assigned(_Parent) and (_Parent.InnerText <> '')) or (Assigned(_FirstNode)
and ((_FirstNode.NodeType = xtCData) or (Node.NodeType = xtCData))) Then
Raise EXMLException.Create(ClassType, 'Insert', @SIsTextNode, _Parent.Name);
If Assigned(RNode) and (not (RNode is TXMLNode) or (RNode.ParentList <> Self)) Then
Raise EXMLException.Create(ClassType, 'Insert', @SNodeNotInList);
If Assigned(Node.ParentList) Then Node := Node.ParentList.Remove(Node);
Inc(_NodesCount);
If previousR Then Begin
If not Assigned(RNode) Then RNode := _FirstNode;
If not Assigned(_FirstNode) or (_FirstNode = RNode) Then _FirstNode := Node;
If not Assigned(_LastNode) Then _LastNode := Node;
If Assigned(RNode) Then Begin
If Assigned(RNode.InnerPrev) Then RNode.InnerPrev.InnerNext := Node;
Node.InnerPrev := RNode.InnerPrev;
Node.InnerNext := RNode;
RNode.InnerPrev := Node;
End;
End Else Begin
If not Assigned(RNode) Then RNode := _LastNode;
If not Assigned(_FirstNode) Then _FirstNode := Node;
If not Assigned(_LastNode) or (_FirstNode = RNode) Then _LastNode := Node;
If Assigned(RNode) Then Begin
If Assigned(RNode.InnerNext) Then RNode.InnerNext.InnerPrev := Node;
Node.InnerNext := RNode.InnerNext;
Node.InnerPrev := RNode;
RNode.InnerNext := Node;
End;
End;
Node.CheckCrypted(True);
Result := Node;
DoNodeChange(Result, xcAddetNode);
End;