![]() |
[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:
Das führt zu Problemen, wenn man anschließend durch die Knoten iterieren will.
//IXmlNode.ChildNodes.Count = 0
IXmlNode.AddChild('neu'); //IXmlNode.ChildNodes.Count = 4 Die Ursache liegt in XmlDocument.Options -> doNodeAutoIndent Folgender Test zeigt das Problem: (xml = TXmlDocument)
Delphi-Quellcode:
Ohne AutoIndent:
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;
Code:
MitAutoIndent:
Test -> 1 // OK
xyz -> 0 --- <?xml version="1.0" standalone="yes"?> <Test Id="12345"><xyz/></Test>
Code:
Wird die Datei gespeichert und wieder geöffnet, besteht das Problem nicht mehr. Dadurch war es noch schwieriger, die Sache einzuordnen :(
Test -> 4 // PROBLEM
#text -> 0 #text -> 0 xyz -> 0 #text -> 0 --- <?xml version="1.0" standalone="yes"?> <Test Id="12345"> <xyz/> </Test> Also werde ich die Datei wohl erst vor dem speichern formatieren... Oder gibt es eine bessere Lösung? Normalize half nicht weiter. |
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:
DOMVendor ist MSXML und im XMLDoc ist alles auf Standard außer doNodeAutoIndent ist auf TrueVst.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; Gruss Bodo |
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 10:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz