AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML [gelöst] AddChild fügt 4 Knoten hinzu

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

Ein Thema von stahli · begonnen am 22. Aug 2010 · letzter Beitrag vom 23. Aug 2010
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.224 Beiträge
 
Delphi 10.4 Sydney
 
#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
bodoka

Registriert seit: 31. Aug 2006
1 Beiträge
 
Delphi 2007 Professional
 
#2

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

  Alt 23. Aug 2010, 10:32
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.603 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 23. Aug 2010, 10:38
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 05:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf