?? xml-sax-features-walkthrough.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-x11-commercial-3.0.5/doc/xml-sax-features-walkthrough.doc:36 --><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Walkthrough: Using SAX2 features with the Qt XML classes</title><style type="text/css"><!--h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }a:link { color: #004faf; text-decoration: none }a:visited { color: #672967; text-decoration: none }body { background: #ffffff; color: black; }--></style></head><body><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr bgcolor="#E5E5E5"><td valign=center> <a href="index.html"><font color="#004faf">Home</font></a> | <a href="classes.html"><font color="#004faf">All Classes</font></a> | <a href="mainclasses.html"><font color="#004faf">Main Classes</font></a> | <a href="annotated.html"><font color="#004faf">Annotated</font></a> | <a href="groups.html"><font color="#004faf">Grouped Classes</font></a> | <a href="functions.html"><font color="#004faf">Functions</font></a></td><td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>Walkthrough: Using SAX2 features with the Qt XML classes</h1> <p> <p> This document assumes that you are familiar with <a href="xml.html#namespaces">namespaces</a> in XML and the concept of a <a href="xml.html#sax2">SAX2 parser</a>.If features of SAX2 readers are new to you please read <a href="xml.html#sax2Features">the feature section</a> of the SAX2 document.<p> As a novice to the Qt XML classes it is advisable to have a look at the<a href="xml-sax-walkthrough.html">tiny SAX2 parser walkthrough</a> beforereading on. <p> This walkthrough covers two topics: First of all it shows how toset SAX2 features and secondly how to integrate the Qt XML functionality into a Qt GUI application.<p> The resulting application allows you to compare the output of the readerdepending on how the two features <em>http://xml.org/sax/features/namespace-prefixes</em>and <em>http://xml.org/sax/features/namespaces</em> are set. To do this it shows tree views of the read XML file listing the qualified names of elements and attributes and the respective namespace URIs.<p> <h3>Setting features</h3><p> <p> Let's begin with the main program of the application. First the boring part: we include all the classes we need:<p> <pre> #include "structureparser.h" #include <<a href="qapplication-h.html">qapplication.h</a>> #include <<a href="qfile-h.html">qfile.h</a>> #include <<a href="qxml-h.html">qxml.h</a>> #include <<a href="qlistview-h.html">qlistview.h</a>> #include <<a href="qgrid-h.html">qgrid.h</a>> #include <<a href="qmainwindow-h.html">qmainwindow.h</a>> #include <<a href="qlabel-h.html">qlabel.h</a>></pre><p> <a href="#structureparser.h">structureparser.h</a> contains the API of the XML parser that we implement in <a href="#structureparser.cpp">structureparser.cpp.</a><p> <pre> int main( int argc, char **argv ) { <a href="qapplication.html">QApplication</a> app( argc, argv );</pre><p> As usual we then create a Qt application object and hand command line argumentsover to it.<p> <pre> <a href="qfile.html">QFile</a> xmlFile( argc == 2 ? argv[1] : "fnord.xml" );</pre><p> If the user runs the program with one filename asan argument we process this file, otherwise we use the <em>fnord.xml</em> file fromthe example directory for demonstration purposes. <p> <pre> <a href="qxmlinputsource.html">QXmlInputSource</a> source( &xmlFile );</pre><p> We use <em>xmlFile</em> as the XML Input Source...<p> <pre> <a href="qxmlsimplereader.html">QXmlSimpleReader</a> reader;</pre><p> ... and instantiate a <em>reader</em> object. Later we will manipulate its featuresand thus influence how the XML data are read.<p> <pre> <a href="qgrid.html">QGrid</a> * container = new <a href="qgrid.html">QGrid</a>( 3 );</pre><p> Now let's think about presenting the output: As described in the<a href="xml.html#sax2Features">Qt SAX2 documentation</a>there are three valid combinations of <em>http://xml.org/sax/features/namespace-prefixes</em>and <em>http://xml.org/sax/features/namespaces</em>: TRUE/TRUE, TRUE/FALSE andFALSE/TRUE. To show the relevant output side by side of each other and mark them with three labels makes up for a grid layout consistingof three columns (and thus two lines).<p> <pre> <a href="qlistview.html">QListView</a> * nameSpace = new <a href="qlistview.html">QListView</a>( container, "table_namespace" );</pre><p> The most natural way of presenting XML elements is in a tree. Thus we use a listview. Its name <em>nameSpace</em> indicates that thisone will be used to present the combination of <em>http://xml.org/sax/features/namespaces</em> being TRUE and <em>http://xml.org/sax/features/namespace-prefixes</em>being FALSE -- the default configuration of a <a href="qxmlsimplereader.html">QXmlSimpleReader</a>.<p> Being the first grid entry the <em>nameSpace</em> listview willappear in the upper left corner of the virtual grid. <p> <pre> StructureParser * handler = new StructureParser( nameSpace );</pre><p> Then we create a handler that deals with the XML data read by the reader.As the provided handler class <a href="qxmldefaulthandler.html">QXmlDefaultHandler</a> simply does nothingwith the data from the reader,we can't use it right away. Instead we have to subclass our own <a href="#structureparser.cpp">StructureParser</a> from it.<p> <pre> reader.<a href="qxmlreader.html#setContentHandler">setContentHandler</a>( handler );</pre><p> The <em>handler</em> serves as content handler for the reader. Note thatfor simplicity reasons we don't register e.g. an error handler. Thus our program will not complain about for example missing closing tagsin the parsed XML document.<p> <pre> reader.<a href="qxmlsimplereader.html#parse">parse</a>( source );</pre><p> Finally we parse the document with the reader's default feature settings.<p> <pre> <a href="qlistview.html">QListView</a> * namespacePrefix = new <a href="qlistview.html">QListView</a>( container, "table_namespace_prefix" );</pre><p> Now we prepare for the parsing of the same XML input source with different reader settings. The output will be presented ina second <a href="qlistview.html">QListView</a>, <em>namespacePrefix</em>. As it is the secondmember of the <em>container</em> grid it will appear in the middle ofthe upper grid row.<p> <pre> handler->setListView( namespacePrefix );</pre><p> Then we ask the <em>handler</em> to present the data in the <em>namespacePrefix</em>listview.<p> <pre> <a name="x2106"></a> reader.<a href="qxmlreader.html#setFeature">setFeature</a>( "http://xml.org/sax/features/namespace-prefixes", TRUE );</pre><p> Now we modify the behaviour of the <em>reader</em> and change <em>http://xml.org/sax/features/namespace-prefixes</em> from the default FALSEto TRUE. The <em>http://xml.org/sax/features/namespaces</em> feature hasstill its default setting TRUE.<p> <pre> source.<a href="qxmlinputsource.html#reset">reset</a>();</pre><p> We have to reset the input source to make the new parsing start from thebeginning of the document again.<p> <pre> reader.<a href="qxmlsimplereader.html#parse">parse</a>( source );</pre><p> Finally we parse the XML file a second time with the changed reader settings (TRUE/TRUE).<p> <pre> <a href="qlistview.html">QListView</a> * prefix = new <a href="qlistview.html">QListView</a>( container, "table_prefix"); handler->setListView( prefix ); reader.<a href="qxmlreader.html#setFeature">setFeature</a>( "http://xml.org/sax/features/namespaces", FALSE ); source.<a href="qxmlinputsource.html#reset">reset</a>(); reader.<a href="qxmlsimplereader.html#parse">parse</a>( source );</pre><p> Next we prepare and use the upper right listview to show the reader resultswith the feature setting <em>http://xml.org/sax/features/namespaces</em>FALSE and <em>http://xml.org/sax/features/namespace-prefixes</em> TRUE.<p> <pre> // namespace label (void) new <a href="qlabel.html">QLabel</a>( "Default:\n" "http://xml.org/sax/features/namespaces: TRUE\n" "http://xml.org/sax/features/namespace-prefixes: FALSE\n", container ); // namespace prefix label (void) new <a href="qlabel.html">QLabel</a>( "\n" "http://xml.org/sax/features/namespaces: TRUE\n" "http://xml.org/sax/features/namespace-prefixes: TRUE\n", container ); // prefix label (void) new <a href="qlabel.html">QLabel</a>( "\n" "http://xml.org/sax/features/namespaces: FALSE\n" "http://xml.org/sax/features/namespace-prefixes: TRUE\n", container );</pre><p> The second row of the <em>container</em> grid is filled with three labelsdenoting the reader settings that belong to the above listview.<p> <pre> app.<a href="qapplication.html#setMainWidget">setMainWidget</a>( container ); container-><a href="qwidget.html#show">show</a>(); return app.<a href="qapplication.html#exec">exec</a>(); }</pre><p> Same procedure as with every Qt GUI program: the grid serves as themain widget of our application and is shown. After that we enterthe GUI's event loop.<p> <h3><a name="structureparser.h">The handler API</a></h3><p> Let's have a brief look at the API of our handler class<em>StructureParser</em>:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -