source: trunk/doc/src/xml-processing/xml-processing.qdoc@ 568

Last change on this file since 568 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

  • Property svn:eol-style set to native
File size: 26.5 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the documentation of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \group xml-tools
44 \title XML Classes
45
46 \brief Classes that support XML, via, for example DOM and SAX.
47
48 These classes are relevant to XML users.
49
50 \generatelist{related}
51*/
52
53/*!
54 \page xml-processing.html
55 \title XML Processing
56 \brief An Overview of the XML processing facilities in Qt.
57
58 In addition to core XML support, classes for higher level querying
59 and manipulation of XML data are provided by the QtXmlPatterns
60 module. In the QtSvg module, the QSvgRenderer and QSvgGenerator
61 classes can read and write a subset of SVG, an XML-based file
62 format. Qt also provides helper functions that may be useful to
63 those working with XML and XHTML: see Qt::escape() and
64 Qt::convertFromPlainText().
65
66 \section1 Topics:
67
68 \list
69 \o \l {Classes for XML Processing}
70 \o \l {An Introduction to Namespaces}
71 \o \l {XML Streaming}
72 \o \l {The SAX Interface}
73 \o \l {Working with the DOM Tree}
74 \o \l {Using XML Technologies}{XQuery/XPath and XML Schema}
75 \list
76 \o \l{A Short Path to XQuery}
77 \endlist
78 \endlist
79
80 \section1 Classes for XML Processing
81
82 These classes are relevant to XML users.
83
84 \annotatedlist xml-tools
85*/
86
87/*!
88 \page xml-namespaces.html
89 \title An Introduction to Namespaces
90 \target namespaces
91
92 \contentspage XML Processing
93 \nextpage XML Streaming
94
95 Parts of the Qt XML module documentation assume that you are familiar
96 with XML namespaces. Here we present a brief introduction; skip to
97 \link #namespacesConventions Qt XML documentation conventions \endlink
98 if you already know this material.
99
100 Namespaces are a concept introduced into XML to allow a more modular
101 design. With their help data processing software can easily resolve
102 naming conflicts in XML documents.
103
104 Consider the following example:
105
106 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 6
107
108 Here we find three different uses of the name \e title. If you wish to
109 process this document you will encounter problems because each of the
110 \e titles should be displayed in a different manner -- even though
111 they have the same name.
112
113 The solution would be to have some means of identifying the first
114 occurrence of \e title as the title of a book, i.e. to use the \e
115 title element of a book namespace to distinguish it from, for example,
116 the chapter title, e.g.:
117 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 7
118
119 \e book in this case is a \e prefix denoting the namespace.
120
121 Before we can apply a namespace to element or attribute names we must
122 declare it.
123
124 Namespaces are URIs like \e http://www.example.com/fnord/book/. This
125 does not mean that data must be available at this address; the URI is
126 simply used to provide a unique name.
127
128 We declare namespaces in the same way as attributes; strictly speaking
129 they \e are attributes. To make for example \e
130 http://www.example.com/fnord/ the document's default XML namespace \e
131 xmlns we write
132
133 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 8
134
135 To distinguish the \e http://www.example.com/fnord/book/ namespace from
136 the default, we must supply it with a prefix:
137
138 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 9
139
140 A namespace that is declared like this can be applied to element and
141 attribute names by prepending the appropriate prefix and a ":"
142 delimiter. We have already seen this with the \e book:title element.
143
144 Element names without a prefix belong to the default namespace. This
145 rule does not apply to attributes: an attribute without a prefix does
146 not belong to any of the declared XML namespaces at all. Attributes
147 always belong to the "traditional" namespace of the element in which
148 they appear. A "traditional" namespace is not an XML namespace, it
149 simply means that all attribute names belonging to one element must be
150 different. Later we will see how to assign an XML namespace to an
151 attribute.
152
153 Due to the fact that attributes without prefixes are not in any XML
154 namespace there is no collision between the attribute \e title (that
155 belongs to the \e author element) and for example the \e title element
156 within a \e chapter.
157
158 Let's clarify this with an example:
159 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 10
160
161 Within the \e document element we have two namespaces declared. The
162 default namespace \e http://www.example.com/fnord/ applies to the \e
163 book element, the \e chapter element, the appropriate \e title element
164 and of course to \e document itself.
165
166 The \e book:author and \e book:title elements belong to the namespace
167 with the URI \e http://www.example.com/fnord/book/.
168
169 The two \e book:author attributes \e title and \e name have no XML
170 namespace assigned. They are only members of the "traditional"
171 namespace of the element \e book:author, meaning that for example two
172 \e title attributes in \e book:author are forbidden.
173
174 In the above example we circumvent the last rule by adding a \e title
175 attribute from the \e http://www.example.com/fnord/ namespace to \e
176 book:author: the \e fnord:title comes from the namespace with the
177 prefix \e fnord that is declared in the \e book:author element.
178
179 Clearly the \e fnord namespace has the same namespace URI as the
180 default namespace. So why didn't we simply use the default namespace
181 we'd already declared? The answer is quite complex:
182 \list
183 \o attributes without a prefix don't belong to any XML namespace at
184 all, not even to the default namespace;
185 \o additionally omitting the prefix would lead to a \e title-title clash;
186 \o writing it as \e xmlns:title would declare a new namespace with the
187 prefix \e title instead of applying the default \e xmlns namespace.
188 \endlist
189
190 With the Qt XML classes elements and attributes can be accessed in two
191 ways: either by refering to their qualified names consisting of the
192 namespace prefix and the "real" name (or \e local name) or by the
193 combination of local name and namespace URI.
194
195 More information on XML namespaces can be found at
196 \l http://www.w3.org/TR/REC-xml-names/.
197
198 \target namespacesConventions
199 \section1 Conventions Used in the Qt XML Documentation
200
201 The following terms are used to distinguish the parts of names within
202 the context of namespaces:
203 \list
204 \o The \e {qualified name}
205 is the name as it appears in the document. (In the above example \e
206 book:title is a qualified name.)
207 \o A \e {namespace prefix} in a qualified name
208 is the part to the left of the ":". (\e book is the namespace prefix in
209 \e book:title.)
210 \o The \e {local part} of a name (also refered to as the \e {local
211 name}) appears to the right of the ":". (Thus \e title is the
212 local part of \e book:title.)
213 \o The \e {namespace URI} ("Uniform Resource Identifier") is a unique
214 identifier for a namespace. It looks like a URL
215 (e.g. \e http://www.example.com/fnord/ ) but does not require
216 data to be accessible by the given protocol at the named address.
217 \endlist
218
219 Elements without a ":" (like \e chapter in the example) do not have a
220 namespace prefix. In this case the local part and the qualified name
221 are identical (i.e. \e chapter).
222
223 \sa {DOM Bookmarks Example}, {SAX Bookmarks Example}
224*/
225
226/*!
227 \page xml-streaming.html
228 \title XML Streaming
229
230 \previouspage An Introduction to Namespaces
231 \contentspage XML Processing
232 \nextpage The SAX Interface
233
234 Since version 4.3, Qt provides two new classes for reading and
235 writing XML: QXmlStreamReader and QXmlStreamWriter.
236
237 The QXmlStreamReader and QXmlStreamWriter are two new classes provided
238 in Qt 4.3 and later. A stream reader reports an XML document as a stream
239 of tokens. This differs from SAX as SAX applications provide handlers to
240 receive XML events from the parser whereas the QXmlStreamReader drives the
241 loop, pulling tokens from the reader when they are needed.
242 This pulling approach makes it possible to build recursive descent parsers,
243 allowing XML parsing code to be split into different methods or classes.
244
245 QXmlStreamReader is a well-formed XML 1.0 parser that excludes external
246 parsed entities. Hence, data provided by the stream reader adheres to the
247 W3C's criteria for well-formed XML, as long as no error occurs. Otherwise,
248 functions such as \l{QXmlStreamReader::atEnd()}{atEnd()},
249 \l{QXmlStreamReader::error()}{error()} and \l{QXmlStreamReader::hasError()}
250 {hasError()} can be used to check and view the errors.
251
252 An example of QXmlStreamReader implementation would be the \c XbelReader in
253 \l{QXmlStream Bookmarks Example}, which is a subclass of QXmlStreamReader.
254 The constructor takes \a treeWidget as a parameter and the class has Xbel
255 specific functions:
256
257 \snippet examples/xml/streambookmarks/xbelreader.h 1
258
259 \dots
260 \snippet examples/xml/streambookmarks/xbelreader.h 2
261 \dots
262
263 The \c read() function accepts a QIODevice and sets it with
264 \l{QXmlStreamReader::setDevice()}{setDevice()}. The
265 \l{QXmlStreamReader::raiseError()}{raiseError()} function is used to
266 display a custom error message, inidicating that the file's version
267 is incorrect.
268
269 \snippet examples/xml/streambookmarks/xbelreader.cpp 1
270
271 The pendent to QXmlStreamReader is QXmlStreamWriter, which provides an XML
272 writer with a simple streaming API. QXmlStreamWriter operates on a
273 QIODevice and has specialised functions for all XML tokens or events you
274 want to write, such as \l{QXmlStreamWriter::writeDTD()}{writeDTD()},
275 \l{QXmlStreamWriter::writeCharacters()}{writeCharacters()},
276 \l{QXmlStreamWriter::writeComment()}{writeComment()} and so on.
277
278 To write XML document with QXmlStreamWriter, you start a document with the
279 \l{QXmlStreamWriter::writeStartDocument()}{writeStartDocument()} function
280 and end it with \l{QXmlStreamWriter::writeEndDocument()}
281 {writeEndDocument()}, which implicitly closes all remaining open tags.
282 Element tags are opened with \l{QXmlStreamWriter::writeStartDocument()}
283 {writeStartDocument()} and followed by
284 \l{QXmlStreamWriter::writeAttribute()}{writeAttribute()} or
285 \l{QXmlStreamWriter::writeAttributes()}{writeAttributes()},
286 element content, and then \l{QXmlStreamWriter::writeEndDocument()}
287 {writeEndDocument()}. Also, \l{QXmlStreamWriter::writeEmptyElement()}
288 {writeEmptyElement()} can be used to write empty elements.
289
290 Element content comprises characters, entity references or nested elements.
291 Content can be written with \l{QXmlStreamWriter::writeCharacters()}
292 {writeCharacters()}, a function that also takes care of escaping all
293 forbidden characters and character sequences,
294 \l{QXmlStreamWriter::writeEntityReference()}{writeEntityReference()},
295 or subsequent calls to \l{QXmlStreamWriter::writeStartElement()}
296 {writeStartElement()}.
297
298 The \c XbelWriter class from \l{QXmlStream Bookmarks Example} is a subclass
299 of QXmlStreamWriter. Its \c writeFile() function illustrates the core
300 functions of QXmlStreamWriter mentioned above:
301
302 \snippet examples/xml/streambookmarks/xbelwriter.cpp 1
303*/
304
305/*!
306 \page xml-sax.html
307 \title The SAX interface
308
309 \previouspage XML Streaming
310 \contentspage XML Processing
311 \nextpage Working with the DOM Tree
312
313 SAX is an event-based standard interface for XML parsers.
314 The Qt interface follows the design of the SAX2 Java implementation.
315 Its naming scheme was adapted to fit the Qt naming conventions.
316 Details on SAX2 can be found at \l{http://www.saxproject.org}.
317
318 Support for SAX2 filters and the reader factory are under
319 development. The Qt implementation does not include the SAX1
320 compatibility classes present in the Java interface.
321
322 \section1 Introduction to SAX2
323
324 The SAX2 interface is an event-driven mechanism to provide the user with
325 document information. An "event" in this context means something
326 reported by the parser, for example, it has encountered a start tag,
327 or an end tag, etc.
328
329 To make it less abstract consider the following example:
330 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 3
331
332 Whilst reading (a SAX2 parser is usually referred to as "reader")
333 the above document three events would be triggered:
334 \list 1
335 \o A start tag occurs (\c{<quote>}).
336 \o Character data (i.e. text) is found, "A quotation.".
337 \o An end tag is parsed (\c{</quote>}).
338 \endlist
339
340 Each time such an event occurs the parser reports it; you can set up
341 event handlers to respond to these events.
342
343 Whilst this is a fast and simple approach to read XML documents,
344 manipulation is difficult because data is not stored, simply handled
345 and discarded serially. The \l{Working with the DOM Tree}{DOM interface}
346 reads in and stores the whole document in a tree structure;
347 this takes more memory, but makes it easier to manipulate the
348 document's structure.
349
350 The Qt XML module provides an abstract class, \l QXmlReader, that
351 defines the interface for potential SAX2 readers. Qt includes a reader
352 implementation, \l QXmlSimpleReader, that is easy to adapt through
353 subclassing.
354
355 The reader reports parsing events through special handler classes:
356 \table
357 \header \o Handler class \o Description
358 \row \o \l QXmlContentHandler
359 \o Reports events related to the content of a document (e.g. the start tag
360 or characters).
361 \row \o \l QXmlDTDHandler
362 \o Reports events related to the DTD (e.g. notation declarations).
363 \row \o \l QXmlErrorHandler
364 \o Reports errors or warnings that occurred during parsing.
365 \row \o \l QXmlEntityResolver
366 \o Reports external entities during parsing and allows users to resolve
367 external entities themselves instead of leaving it to the reader.
368 \row \o \l QXmlDeclHandler
369 \o Reports further DTD related events (e.g. attribute declarations).
370 \row \o \l QXmlLexicalHandler
371 \o Reports events related to the lexical structure of the
372 document (the beginning of the DTD, comments etc.).
373 \endtable
374
375 These classes are abstract classes describing the interface. The \l
376 QXmlDefaultHandler class provides a "do nothing" default
377 implementation for all of them. Therefore users only need to overload
378 the QXmlDefaultHandler functions they are interested in.
379
380 To read input XML data a special class \l QXmlInputSource is used.
381
382 Apart from those already mentioned, the following SAX2 support classes
383 provide additional useful functionality:
384 \table
385 \header \o Class \o Description
386 \row \o \l QXmlAttributes
387 \o Used to pass attributes in a start element event.
388 \row \o \l QXmlLocator
389 \o Used to obtain the actual parsing position of an event.
390 \row \o \l QXmlNamespaceSupport
391 \o Used to implement namespace support for a reader. Note that
392 namespaces do not change the parsing behavior. They are only
393 reported through the handler.
394 \endtable
395
396 The \l{SAX Bookmarks example} illustrates how to subclass
397 QXmlDefaultHandler to read an XML bookmark file (XBEL) and
398 how to generate XML by hand.
399
400 \section1 SAX2 Features
401
402 The behavior of an XML reader depends on its support for certain
403 optional features. For example, a reader may have the feature "report
404 attributes used for namespace declarations and prefixes along with
405 the local name of a tag". Like every other feature this has a unique
406 name represented by a URI: it is called
407 \e http://xml.org/sax/features/namespace-prefixes.
408
409 The Qt SAX2 implementation can report whether the reader has
410 particular functionality using the QXmlReader::hasFeature()
411 function. Available features can be tested with QXmlReader::feature(),
412 and switched on or off using QXmlReader::setFeature().
413
414 Consider the example
415 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 4
416 A reader that does not support the \e
417 http://xml.org/sax/features/namespace-prefixes feature would report
418 the element name \e document but not its attributes \e xmlns:book and
419 \e xmlns with their values. A reader with the feature \e
420 http://xml.org/sax/features/namespace-prefixes reports the namespace
421 attributes if the \link QXmlReader::feature() feature\endlink is
422 switched on.
423
424 Other features include \e http://xml.org/sax/features/namespace
425 (namespace processing, implies \e
426 http://xml.org/sax/features/namespace-prefixes) and \e
427 http://xml.org/sax/features/validation (the ability to report
428 validation errors).
429
430 Whilst SAX2 leaves it to the user to define and implement whatever
431 features are required, support for \e
432 http://xml.org/sax/features/namespace (and thus \e
433 http://xml.org/sax/features/namespace-prefixes) is mandantory.
434 The \l QXmlSimpleReader implementation of \l QXmlReader,
435 supports them, and can do namespace processing.
436
437 \l QXmlSimpleReader is not validating, so it
438 does not support \e http://xml.org/sax/features/validation.
439
440 \section1 Namespace Support via Features
441
442 As we have seen in the previous section, we can configure the
443 behavior of the reader when it comes to namespace
444 processing. This is done by setting and unsetting the
445 \e http://xml.org/sax/features/namespaces and
446 \e http://xml.org/sax/features/namespace-prefixes features.
447
448 They influence the reporting behavior in the following way:
449 \list 1
450 \o Namespace prefixes and local parts of elements and attributes can
451 be reported.
452 \o The qualified names of elements and attributes are reported.
453 \o \l QXmlContentHandler::startPrefixMapping() and \l
454 QXmlContentHandler::endPrefixMapping() are called by the reader.
455 \o Attributes that declare namespaces (i.e. the attribute \e xmlns and
456 attributes starting with \e{xmlns:}) are reported.
457 \endlist
458
459 Consider the following element:
460 \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 5
461 With \e http://xml.org/sax/features/namespace-prefixes set to true
462 the reader will report four attributes; but with the \e
463 namespace-prefixes feature set to false only three, with the \e
464 xmlns:fnord attribute defining a namespace being "invisible" to the
465 reader.
466
467 The \e http://xml.org/sax/features/namespaces feature is responsible
468 for reporting local names, namespace prefixes and URIs. With \e
469 http://xml.org/sax/features/namespaces set to true the parser will
470 report \e title as the local name of the \e fnord:title attribute, \e
471 fnord being the namespace prefix and \e http://example.com/fnord/ as
472 the namespace URI. When \e http://xml.org/sax/features/namespaces is
473 false none of them are reported.
474
475 In the current implementation the Qt XML classes follow the definition
476 that the prefix \e xmlns itself isn't associated with any namespace at all
477 (see \link http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-using
478 http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-using \endlink).
479 Therefore even with \e http://xml.org/sax/features/namespaces and
480 \e http://xml.org/sax/features/namespace-prefixes both set to true
481 the reader won't return either a local name, a namespace prefix or
482 a namespace URI for \e xmlns:fnord.
483
484 This might be changed in the future following the W3C suggestion
485 \link http://www.w3.org/2000/xmlns/ http://www.w3.org/2000/xmlns/ \endlink
486 to associate \e xmlns with the namespace \e http://www.w3.org/2000/xmlns.
487
488 As the SAX2 standard suggests, \l QXmlSimpleReader defaults to having
489 \e http://xml.org/sax/features/namespaces set to true and
490 \e http://xml.org/sax/features/namespace-prefixes set to false.
491 When changing this behavior using \l QXmlSimpleReader::setFeature()
492 note that the combination of both features set to
493 false is illegal.
494
495 \section2 Summary
496
497 \l QXmlSimpleReader implements the following behavior:
498
499 \table
500 \header \o (namespaces, namespace-prefixes)
501 \o Namespace prefix and local part
502 \o Qualified names
503 \o Prefix mapping
504 \o xmlns attributes
505 \row \o (true, false) \o Yes \o Yes* \o Yes \o No
506 \row \o (true, true) \o Yes \o Yes \o Yes \o Yes
507 \row \o (false, true) \o No* \o Yes \o No* \o Yes
508 \row \o (false, false) \i41 Illegal
509 \endtable
510
511 The behavior of the entries marked with an asterisk (*) is not specified by SAX.
512
513 \section1 Properties
514
515 Properties are a more general concept. They have a unique name,
516 represented as an URI, but their value is \c void*. Thus nearly
517 anything can be used as a property value. This concept involves some
518 danger, though: there is no means of ensuring type-safety; the user
519 must take care that they pass the right type. Properties are
520 useful if a reader supports special handler classes.
521
522 The URIs used for features and properties often look like URLs, e.g.
523 \c http://xml.org/sax/features/namespace. This does not mean that the
524 data required is at this address. It is simply a way of defining
525 unique names.
526
527 Anyone can define and use new SAX2 properties for their readers.
528 Property support is not mandatory.
529
530 To set or query properties the following functions are provided: \l
531 QXmlReader::setProperty(), \l QXmlReader::property() and \l
532 QXmlReader::hasProperty().
533*/
534
535/*!
536 \page xml-dom.tml
537 \title Working with the DOM Tree
538 \target dom
539
540 \previouspage The SAX Interface
541 \contentspage XML Processing
542 \nextpage {Using XML Technologies}{XQuery/XPath and XML Schema}
543
544 DOM Level 2 is a W3C Recommendation for XML interfaces that maps the
545 constituents of an XML document to a tree structure. The specification
546 of DOM Level 2 can be found at \l{http://www.w3.org/DOM/}.
547
548 \target domIntro
549 \section1 Introduction to DOM
550
551 DOM provides an interface to access and change the content and
552 structure of an XML file. It makes a hierarchical view of the document
553 (a tree view). Thus -- in contrast to the SAX2 interface -- an object
554 model of the document is resident in memory after parsing which makes
555 manipulation easy.
556
557 All DOM nodes in the document tree are subclasses of \l QDomNode. The
558 document itself is represented as a \l QDomDocument object.
559
560 Here are the available node classes and their potential child classes:
561
562 \list
563 \o \l QDomDocument: Possible children are
564 \list
565 \o \l QDomElement (at most one)
566 \o \l QDomProcessingInstruction
567 \o \l QDomComment
568 \o \l QDomDocumentType
569 \endlist
570 \o \l QDomDocumentFragment: Possible children are
571 \list
572 \o \l QDomElement
573 \o \l QDomProcessingInstruction
574 \o \l QDomComment
575 \o \l QDomText
576 \o \l QDomCDATASection
577 \o \l QDomEntityReference
578 \endlist
579 \o \l QDomDocumentType: No children
580 \o \l QDomEntityReference: Possible children are
581 \list
582 \o \l QDomElement
583 \o \l QDomProcessingInstruction
584 \o \l QDomComment
585 \o \l QDomText
586 \o \l QDomCDATASection
587 \o \l QDomEntityReference
588 \endlist
589 \o \l QDomElement: Possible children are
590 \list
591 \o \l QDomElement
592 \o \l QDomText
593 \o \l QDomComment
594 \o \l QDomProcessingInstruction
595 \o \l QDomCDATASection
596 \o \l QDomEntityReference
597 \endlist
598 \o \l QDomAttr: Possible children are
599 \list
600 \o \l QDomText
601 \o \l QDomEntityReference
602 \endlist
603 \o \l QDomProcessingInstruction: No children
604 \o \l QDomComment: No children
605 \o \l QDomText: No children
606 \o \l QDomCDATASection: No children
607 \o \l QDomEntity: Possible children are
608 \list
609 \o \l QDomElement
610 \o \l QDomProcessingInstruction
611 \o \l QDomComment
612 \o \l QDomText
613 \o \l QDomCDATASection
614 \o \l QDomEntityReference
615 \endlist
616 \o \l QDomNotation: No children
617 \endlist
618
619 With \l QDomNodeList and \l QDomNamedNodeMap two collection classes
620 are provided: \l QDomNodeList is a list of nodes,
621 and \l QDomNamedNodeMap is used to handle unordered sets of nodes
622 (often used for attributes).
623
624 The \l QDomImplementation class allows the user to query features of the
625 DOM implementation.
626
627 To get started please refer to the \l QDomDocument documentation.
628 You might also want to take a look at the \l{DOM Bookmarks example},
629 which illustrates how to read and write an XML bookmark file (XBEL)
630 using DOM.
631*/
Note: See TracBrowser for help on using the repository browser.