Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions |
This example presents a small outliner program to show the basic usage of the DOM classes. The format of the outlines is the OPML format as described in http://www.opml.org/spec.
This example shows how to load a DOM tree from an XML file and how to traverse it.
Sample XML file (todos.opml):
<?xml version="1.0" encoding="ISO-8859-1"?> <opml version="1.0"> <head> <title>Todo List</title> <dateCreated>Tue, 31 Oct 2000 17:00:17 CET</dateCreated> <dateModified>Tue, 31 Oct 2000 17:00:17 CET</dateModified> <ownerName>Arthur Dent</ownerName> <ownerEmail>[email protected]</ownerEmail> </head> <body> <outline text="Background"> <outline text="This is an example todo list."/> </outline> <outline text="Books to read"> <outline text="Science Fiction"> <outline text="Philip K. Dick"> <outline text="Do Androids Dream of Electical Sheep?"/> <outline text="The Three Stigmata of Palmer Eldritch"/> </outline> <outline text="Robert A. Heinlein"> <outline text="Stranger in a Strange Land"/> </outline> <outline text="Isaac Asimov"> <outline text="Foundation and Empire"/> </outline> </outline> <outline text="Qt Books (in English)"> <outline text="Blanchette & Summerfield: C++ GUI Programming with Qt 3"/> <outline text="Dalheimer: Programming with Qt"/> <outline text="Griffith: KDE 2/Qt Programming Bible"/> <outline text="Hughes: Linux Rapid Application Development"/> <outline text="Solin: Qt Programming in 24 hours"/> <outline text="Ward: Qt 2 Programming for Linux and Windows 2000"/> </outline> </outline> <outline text="Shopping list"> <outline text="General"> <outline text="Towel"/> <outline text="Hair dryer"/> <outline text="Underpants"/> </outline> <outline text="For Sunday"> <outline text="Beef"/> <outline text="Rice"/> <outline text="Carrots"/> <outline text="Beans"/> <outline text="Beer"/> <outline text="Wine"/> <outline text="Orange juice"/> </outline> </outline> <outline text="Write a letter to Ford"> </outline> </body> </opml>
Header file (outlinetree.h):
/**************************************************************************** ** $Id: qt/outlinetree.h 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #ifndef OUTLINETREE_H #define OUTLINETREE_H #include <qlistview.h> #include <qdom.h> class OutlineTree : public QListView { Q_OBJECT public: OutlineTree( const QString fileName, QWidget *parent = 0, const char *name = 0 ); ~OutlineTree(); private: QDomDocument domTree; void getHeaderInformation( const QDomElement &header ); void buildTree( QListViewItem *parentItem, const QDomElement &parentElement ); }; #endif // OUTLINETREE_H
Implementation (outlinetree.cpp):
/**************************************************************************** ** $Id: qt/outlinetree.cpp 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #include "outlinetree.h" #include <qfile.h> #include <qmessagebox.h> OutlineTree::OutlineTree( const QString fileName, QWidget *parent, const char *name ) : QListView( parent, name ) { // div. configuration of the list view addColumn( "Outlines" ); setSorting( -1 ); setRootIsDecorated( TRUE ); // read the XML file and create DOM tree QFile opmlFile( fileName ); if ( !opmlFile.open( IO_ReadOnly ) ) { QMessageBox::critical( 0, tr( "Critical Error" ), tr( "Cannot open file %1" ).arg( fileName ) ); return; } if ( !domTree.setContent( &opmlFile ) ) { QMessageBox::critical( 0, tr( "Critical Error" ), tr( "Parsing error for file %1" ).arg( fileName ) ); opmlFile.close(); return; } opmlFile.close(); // get the header information from the DOM QDomElement root = domTree.documentElement(); QDomNode node; node = root.firstChild(); while ( !node.isNull() ) { if ( node.isElement() && node.nodeName() == "head" ) { QDomElement header = node.toElement(); getHeaderInformation( header ); break; } node = node.nextSibling(); } // create the tree view out of the DOM node = root.firstChild(); while ( !node.isNull() ) { if ( node.isElement() && node.nodeName() == "body" ) { QDomElement body = node.toElement(); buildTree( 0, body ); break; } node = node.nextSibling(); } } OutlineTree::~OutlineTree() { } void OutlineTree::getHeaderInformation( const QDomElement &header ) { // visit all children of the header element and look if you can make // something with it QDomNode node = header.firstChild(); while ( !node.isNull() ) { if ( node.isElement() ) { // case for the different header entries if ( node.nodeName() == "title" ) { QDomText textChild = node.firstChild().toText(); if ( !textChild.isNull() ) { setColumnText( 0, textChild.nodeValue() ); } } } node = node.nextSibling(); } } void OutlineTree::buildTree( QListViewItem *parentItem, const QDomElement &parentElement ) { QListViewItem *thisItem = 0; QDomNode node = parentElement.firstChild(); while ( !node.isNull() ) { if ( node.isElement() && node.nodeName() == "outline" ) { // add a new list view item for the outline if ( parentItem == 0 ) thisItem = new QListViewItem( this, thisItem ); else thisItem = new QListViewItem( parentItem, thisItem ); thisItem->setText( 0, node.toElement().attribute( "text" ) ); // recursive build of the tree buildTree( thisItem, node.toElement() ); } node = node.nextSibling(); } }
Main (main.cpp):
/**************************************************************************** ** $Id: qt/main.cpp 3.3.8 edited Jan 11 14:37 $ ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #include <qapplication.h> #include "outlinetree.h" int main( int argc, char **argv ) { QApplication a( argc, argv ); OutlineTree outline( "todos.opml" ); a.setMainWidget( &outline ); outline.show(); return a.exec(); }
See also Qt XML Examples.
Copyright © 2007 Trolltech | Trademarks | Qt 3.3.8
|