Ich habe jetzt mehrere Stunden nach einer Lösung für folgendes Problem gesucht:
"AddChild fügt 4 Knoten hinzu"
Eine Lösung habe ich gefunden - vielleicht hilft es mal jemandem...
Delphi-Quellcode:
//IXmlNode.ChildNodes.Count = 0
IXmlNode.AddChild('neu');
//IXmlNode.ChildNodes.Count = 4
Das führt zu Problemen, wenn man anschließend durch die Knoten iterieren will.
Die Ursache liegt in XmlDocument.Options -> doNodeAutoIndent
Folgender Test zeigt das Problem: (
xml = TXmlDocument)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
N: IXmlNode;
procedure ShowNode(T: Integer; N: IXmlNode);
var
I: Integer;
NN: IXmlNode;
begin
Memo1.Lines.Add(StringOfChar('
', T) + N.NodeName + '
-> ' + IntToStr(N.ChildNodes.Count));
Inc(T, 2);
for I := 0
to N.ChildNodes.Count - 1
do
begin
NN := N.ChildNodes[I];
ShowNode(T, NN);
end;
end;
begin
xml.XML.Text := '
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + #13#10 +
'
<Test/>';
xml.Active := True;
N :=
xml.DocumentElement;
N.Attributes['
Id'] := '
12345';
N.AddChild('
xyz');
ShowNode(0, N);
Memo1.Lines.Add('
---');
Memo1.Lines.AddStrings(
xml.XML);
end;
Ohne AutoIndent:
Code:
Test -> 1 // OK
xyz -> 0
---
<?
xml version="1.0" standalone="yes"?>
<Test Id="12345"><xyz/></Test>
MitAutoIndent:
Code:
Test -> 4 // PROBLEM
#text -> 0
#text -> 0
xyz -> 0
#text -> 0
---
<?
xml version="1.0" standalone="yes"?>
<Test Id="12345">
<xyz/>
</Test>
Wird die Datei gespeichert und wieder geöffnet, besteht das Problem nicht mehr. Dadurch war es noch schwieriger, die Sache einzuordnen
Also werde ich die Datei wohl erst vor dem speichern formatieren...
Oder gibt es eine bessere Lösung?
Normalize half nicht weiter.