Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 23.02.05 00:44 
Hallo,
da ich anfangs in einem meiner Projekte TXMLDocument bzw. IXMLDocument verwendet habe und irgendwann an gewissen Unzulänglichkeiten gestoßen bin, wie z.B. die fehlende Implementierung von CDATA-Tags und das Nicht-Funktionieren unter der Linux-Konsole (mit Kylix kompiliert, aber ohne X-Server betrieben) habe ich für die XDOM-Klassen (www.philo.de/xml/dom/) eine Wrapper-Klasse geschrieben. Diese unterstützt alles, was ich bisher brauche, arbeitet aber vorzugsweise mit Strings und nicht mit Variants und die NextSibling-Funktionen.
Weiterhin werden CDATA-Sections unterstützt. Die Klasse findet sich unten angehängt.

Die Anwendung ist ziemlich ähnlich dem TXMLDocument:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var xml:TWDOMXMLDocument;
    node:TWDOMXMLNode;
begin
xml:=NewXMLDocument;
xml.DocumentElement:=CreateElement('root','');
with xml.DocumentElement do begin
     node:=AddChild('erster'); //Neu erstelltes Element wird zurückgegeben
     node.AddChild('erstes_Kind','EinWert'); //Man kann in AddChild direkt einen Wert zuweisen
     node.AddAttribute('erstes_Kind_Attribut');
     node.Attributes['erstes_Kind_Attribut']:='Ein Attribut-Wert';

     AddCDATAChild('CDATA-Test','Irgendwas was später nicht geparst werden soll ;-)');

     ShowMessage(ChildNodes['CDATA-Test'].Text);
     node:=node.NextSibling;
     ShowMessage(node.Text);
     end;
ShowMessage(xml.XML.Text);

Wie man in dem Beispiel sieht, kann man bei dieser Klasse (anders als der Ursprungsimplementierung) direkt in AddChild einen Wert zuweisen lassen, muss man aber nicht.
Weiterhin gibt NextSibling den nächsten Knoten zu einem Knoten aus.

Die Unit ist dazu gedacht, schnell Implementation von TXMLDocument ersetzen zu können. Dazu muss in vielen Fällen nur die Unit eingebunden und die Variablentypen geändert werden (natürlich sollte XDOM schon vorhanden sein ;-)). Ansonsten sollten die alten Units noch entfernt werden, da teilweise (z.B. NewXMLDocument) gleich Bezeichner verwendet werden.

Da mir diese Unit so ausreicht, bin ich nicht sicher, ob ich weitere Features implementieren werde. Aber ihr könnt mir gerne Anregungen geben, ich versuch diese dann umzusetzen. Vor allem wäre es aber auch schön, mich auf Bugs und Verbesserungsmöglichkeiten hinzuweisen ;-)

Änderungen
==========
13.05.06
  • Änderungen zur Kompatibilität mit XDOM 3.2. Für Version 3.1 muss das Define am Anfang der Unit geändert werden.
09.02.06:
  • Bugfix: 2 Memory-Leaks beseitigt
21.01.06:
  • Bugfix: ChildValues erzeugt nicht automatisch ein entsprechendes Node
24.08.05:
  • Einige Änderungen am Code vorgenommen, um die Unit mit XDOM 3.1.21 lauffähig zu machen (Vielen Dank an user profile iconJens[HTN]
01.07.05:
  • Bug in NextSibling gefixt, der bei mehreren gleich benannten ChildNodes auftrat
  • Funktion PreviousSibling hinzugefügt
07.04.05:
  • Direktes Laden von Dateien mit mehreren Möglichkeiten
  • ChildNodes, die nicht existieren, werden nun automatisch erzeugt
  • First und Last werden nun unterstützt, um das erste und das letzte Element aufzurufen
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von UGrohne am Sa 13.05.06 17:02, insgesamt 8-mal bearbeitet
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 07.04.05 18:40 
So, nach Anregungen habe ich jetzt ein paar Änderungen und Erweiterungen vorgenommen.
Zuerst unterstützt die Klasse jetzt direkt das Laden von XML aus Dateien mit mehreren Möglichkeiten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var xml:TWDOMXMLDocument;
begin
xml:=LoadXMLDocument('test.xml');
//oder
xml:=TWDOMXMLDocument('test.xml');
//oder
xml.LoadFromFile('test.xml');

ähnlich wie TXMLDocument.

Weiterhin habe ich den AutoCreate-Mechanismus von TXMLDocument integriert, bei Aufrufen von ChildNodes, die nicht existieren, werden diese automatisch erzeugt, eingefügt und zurückgegeben. Man erweitert damit also automatisch die XML-Datei

Außerdem unterstützt TWDOMXMLNodeList jetzt auch die Methoden First und Last, die das erste und das letzte Kindelement eines Nodes zurückgeben. Sollte es nicht existieren, wird nil zurückgegeben (wie bei TXMLDocument ;-)).
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 01.07.05 20:27 
Ich habe einen Bug entfernt: Bei Verwendung von NextSibling konnte es bei mehreren gleich benannten Knoten dazu kommen, dass man immer auf den zweiten aber nie weiter kam. Dies wurde ausgelöst durch den Vergleich des Knotennamens in der IndexOf-Funktion. Diese habe ich nun überladen und einen Vergleich mit der Objektinstanz hinzugefügt.

Außerdem unterstützt das Node jetzt die Funktion PreviousSibling.
Jens[HTN]
Hält's aus hier
Beiträge: 4

Win 2000, Win XP, Win 2003, Debian
D2007
BeitragVerfasst: So 17.07.05 04:32 
Hi,

leider funktioniert deine Wrapper-Klasse mit der neusten Version von XDOM nicht :/

Ich habe nun mal "blind" die Klasse bisschen umgeschrieben und in meinen ersten Tests funktionierte alles ohne Probleme. Kenne mich mit XDOM leider (noch) nicht aus, von daher geb ich keine Garantie auf Richtigkeit!

Ich habe die geänderte Datei angehängt.

//Edit: Hab doch noch einen Fehler gefunden, Anhang updated.
Einloggen, um Attachments anzusehen!
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: So 31.07.05 12:06 
Danke, ich war bis heute morgen im Urlaub, da hab ich das nicht mitbekommen :)

Ich werde mir das mal genauer anschauen und meine Version dann auch entsprechend aktualisieren, ich hoffe, ich komme da so schnell wie möglich dazu ...
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 24.08.05 16:47 
So, ich hab die Änderungen jetzt übernommen und sie scheinen bisher ganz gut zu funktionieren. Vielen Dank nochmal an Dich, Jens ;-)
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: So 22.01.06 08:13 
Ich habe gestern mal wieder einen Bug gefunden und behoben. Der Aufruf
ausblenden Delphi-Quelltext
1:
 xml.DocumentElement.ChildValues['test'] := 'Test';					

führte zu einer Zugriffsverletzung, wenn das Node "test" noch nicht existierte. Das passt natürlich zum AutoCreate von ChildNodes, daher habe ich das ausgebessert.