Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   [gelöst] AddChild fügt 4 Knoten hinzu (https://www.delphipraxis.net/153962-%5Bgeloest%5D-addchild-fuegt-4-knoten-hinzu.html)

stahli 22. Aug 2010 21:35

[gelöst] AddChild fügt 4 Knoten hinzu
 
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.

bodoka 23. Aug 2010 09:32

AW: [gelöst] AddChild fügt 4 Knoten hinzu
 
Ich hatte genau das gleiche Problem und habe wochenlang gesucht. Durch Zufall habe ich eine Lösung gefunden die bei mir (Win 7; Delphi 2009) funtioniert.

Bei mir waren es allerdings reine Textknoten. Vielleicht hilft bei Dir auch XNode.HasAttribute(AttrName).

Delphi-Quellcode:
 
  Vst.Clear;
  Vst.BeginUpdate;
  XNodeList:=Cities.ChildNodes;
  for I:=0 to XNodeList.Count - 1 do
  begin
    Data:=TData.Create;
    XNode:=XNodeList.Nodes[I];
    if XNode.IsTextElement then     ------> Das hat gefehlt!!!!
    begin
      Data.Caption:=XNode.Text;
      Vst.AddChild(nil,Data);
    end;
  end;
  Vst.EndUpdate;
DOMVendor ist MSXML und im XMLDoc ist alles auf Standard außer doNodeAutoIndent ist auf True

Gruss Bodo

himitsu 23. Aug 2010 09:38

AW: [gelöst] AddChild fügt 4 Knoten hinzu
 
Jupp, im MSXML-DOM (und bei einigen Anderen) werden die Idents (Formatierungen) ebenfalls als Node verwaltet.

Einzige wirklich sichere Lösung ist eine Filterung dieser Nodes, bei der Verwaltung.

Notfalls könnte man auch, nach dem Einlesen, manuell alle diese Formatierungs-Nodes rauslöschen.
Und eventuell neu Formatieren, bevor man speichert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz