Wie implementiert man eine generische DOM-Datenstruktur in C ++?

9

Ich versuche eine sehr einfache Implementierung der Document Object Model Bibliothek zu schreiben, um eine generische Datenstruktur für meine weiteren Projekte zur Verfügung zu stellen. Um die Dinge einfach zu halten, habe ich nur drei Hauptklassen definiert: node , element und attribute . Ein Knoten wird durch seinen Namen definiert (z. B. alle HTML-Tags) und ist im Grunde ein Container für ein Element, das sowohl Text als auch Unterknoten (gespeichert in std::vector<node> ) sein kann.

Ich kann einfach nicht herausfinden, wie man eine ganze Baumstruktur definiert.

Ich brauche templatisierte Schnittstellen für die Klassen, auf die ich verwiesen habe.

Anwendungsbeispiel:

%Vor%

Ich möchte keine vollständige DOM-Abstraktionsebene mit vollständiger Unterstützung von XML erstellen. Ich brauche nur Ideen, um Informationen im DOM-ähnlichen Stil zu organisieren. Kein Parsen ist erforderlich.

Vielen Dank im Voraus!

    
Rizo 16.10.2010, 23:42
quelle

2 Antworten

1

Anstatt zu versuchen, jeden Knoten basierend auf der Anzahl der vorhandenen Eltern stark zu typisieren, organisieren Sie Ihren Code als Baumstruktur:

%Vor%

Ihre öffentliche Schnittstelle wird sich wahrscheinlich sehr davon unterscheiden. Ich versuche nur, das allgemeine Typenlayout zu zeigen.

Sie benötigen die Knoten- oder Attributfunktionen nicht wirklich, es sei denn, Sie müssen sie zusammen mit Elementen in einer Sammlung durchlaufen. Dies ist eine nützliche Funktion für XML-DOM-Bibliotheken. Wenn Sie jedoch nur versuchen, eine Datenstruktur zu erstellen, müssen Sie dem DOM-Design nicht genau folgen.

In der Tat, wenn Sie nur für eine generische Datenstruktur gehen, möchten Sie vielleicht nur eine Eigenschaft Tasche:

%Vor%

Wenn Sie nur über die Syntax sprechen, können Sie auch versuchen, Probleme mit dem Überladen von operator() und / oder Verkettungsmethoden zu bekommen:

%Vor%

Ich stelle mir vor, je weniger Text / Code Duplikation, desto besser. Je näher Sie Ihrem Code eine Syntax wie JSON oder YAML geben können, desto besser.

Sobald c ++ 0x herauskommt, stehen Ihnen möglicherweise viel einfachere Optionen zur Verfügung. Sie können auch in die boost :: Bibliothek zuweisen für eine einfache Initialisierungssyntax zur Verwendung in Ihrer Datenstruktur.

Sie können auch in die Steigerung schauen: : eine beliebige Bibliothek für einen Datentyp, den Sie anstelle von Strings als Wert verwenden können (unterstützt eine typsichere Methode zum Einfügen beliebiger Werte, solange Sie sie als denselben Typ extrahieren).

    
Merlyn Morgan-Graham 17.10.2010, 02:04
quelle
0

Wenn Sie sich meine früheren Antworten ansehen, werden Sie sehen, dass ich ein Befürworter von Vorlagen bin, aber wenn Sie keine anderen Anforderungen haben, werden sie nur in die Quere kommen. Parser mögen nicht viele verschiedene Arten, mit denen umzugehen ist. (Obwohl du sagst, du brauchst keinen Parser - hm?)

Der Sinn von XML und DOM besteht darin, das Übersetzen von jeder internen Struktur zu erleichtern. Sie sollten nicht nur keine XML-Knotenvorlage definieren, Sie sollten auch keine any Art von benutzerdefinierter Datenstruktur benötigen. Jede Struktur ist bereits im DOM-ähnlichen Stil. DAGs sind problematisch, weil sie irgendwie Bäume und Art-Graphen sind, aber Sie deuten nicht an, dass Sie diese Art von Roadblock schlagen.

Sie sagen (im Kommentar zur gelöschten Antwort), dass Sie keine vorhandene Bibliothek verwenden möchten. Warum? Was versuchst du wirklich?

    
Potatoswatter 17.10.2010 01:59
quelle

Tags und Links