Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

[gelöst] AddChild fügt 4 Knoten hinzu

  Alt 22. Aug 2010, 22:35
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat