summaryrefslogtreecommitdiffstats
path: root/doc/src/qtxml.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/qtxml.qdoc')
-rw-r--r--doc/src/qtxml.qdoc615
1 files changed, 0 insertions, 615 deletions
diff --git a/doc/src/qtxml.qdoc b/doc/src/qtxml.qdoc
deleted file mode 100644
index 4df2589..0000000
--- a/doc/src/qtxml.qdoc
+++ /dev/null
@@ -1,615 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \module QtXml
- \title QtXml Module
- \contentspage Qt's Modules
- \previouspage QtSvg
- \nextpage QtXmlPatterns
- \ingroup modules
-
- \brief The QtXml module provides a stream reader and writer for
- XML documents, and C++ implementations of SAX and DOM.
-
- SAX is an event-based standard interface for XML parsers.
- The Qt interface follows the design of the SAX2 Java implementation.
- Its naming scheme was adapted to fit the Qt naming conventions.
- Details on SAX2 can be found at \l{http://www.saxproject.org}.
-
- Support for SAX2 filters and the reader factory are under
- development. The Qt implementation does not include the SAX1
- compatibility classes present in the Java interface.
- For an introduction to Qt's SAX2 classes, see \l{The Qt SAX2 Classes}.
-
- DOM Level 2 is a W3C Recommendation for XML interfaces that maps the
- constituents of an XML document to a tree structure. The specification
- of DOM Level 2 can be found at \l{http://www.w3.org/DOM/}.
- For more information about the DOM classes in Qt is provided, see
- \l{The Qt DOM Classes}.
-
- Since version 4.3, Qt provides two new classes for reading and
- writing XML: QXmlStreamReader and QXmlStreamWriter.
-
- In addition to core XML support, classes for higher level querying
- and manipulation of XML data, are provided by the QtXmlPatterns
- module. In the QtSvg module, the QSvgRenderer and QSvgGenerator
- classes can read and write a subset of SVG, an XML-based file
- format. Qt also provides helper functions that may be useful to
- those working with XML and XHTML: see Qt::escape() and
- Qt::convertFromPlainText().
-
- Further XML support is provided by the \l{Qt Solutions} group who
- provide, for example, classes that support SOAP and MML with the
- Qt XML classes.
-
- This module is part of the \l{Qt Full Framework Edition} and the
- \l{Open Source Versions of Qt}.
-
- Topics:
-
- \tableofcontents
-
- \section1 Configuring the Build Process
-
- Applications that use Qt's XML classes need to be configured to
- be built against the QtXml module. The following declaration in a
- \c qmake project file ensures that an application is compiled and
- linked appropriately:
-
- To include the definitions of the module's classes, use the
- following directive:
-
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 0
-
- To link against the module, add this line to your \l qmake \c
- .pro file:
-
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 1
-
- This line is necessary because only the QtCore and QtGui modules
- are used in the default build process.
-
- \section1 The QtXml Stream Classes
-
- The QXmlStreamReader and QXmlStreamWriter are two new classes provided
- in Qt 4.3 and later. A stream reader reports an XML document as a stream
- of tokens. This differs from SAX as SAX applications provide handlers to
- receive XML events from the parser whereas the QXmlStreamReader drives the
- loop, pulling tokens from the reader when they are needed.
- This pulling approach makes it possible to build recursive descent parsers,
- allowing XML parsing code to be split into different methods or classes.
-
- QXmlStreamReader is a well-formed XML 1.0 parser that excludes external
- parsed entities. Hence, data provided by the stream reader adheres to the
- W3C's criteria for well-formed XML, as long as no error occurs. Otherwise,
- functions such as \l{QXmlStreamReader::atEnd()}{atEnd()},
- \l{QXmlStreamReader::error()}{error()} and \l{QXmlStreamReader::hasError()}
- {hasError()} can be used to check and view the errors.
-
- An example of QXmlStreamReader implementation would be the \c XbelReader in
- \l{QXmlStream Bookmarks Example}, which is a subclass of QXmlStreamReader.
- The constructor takes \a treeWidget as a parameter and the class has Xbel
- specific functions:
-
- \snippet examples/xml/streambookmarks/xbelreader.h 1
-
- \dots
- \snippet examples/xml/streambookmarks/xbelreader.h 2
- \dots
-
- The \c read() function accepts a QIODevice and sets it with
- \l{QXmlStreamReader::setDevice()}{setDevice()}. The
- \l{QXmlStreamReader::raiseError()}{raiseError()} function is used to
- display a custom error message, inidicating that the file's version
- is incorrect.
-
- \snippet examples/xml/streambookmarks/xbelreader.cpp 1
-
- The pendent to QXmlStreamReader is QXmlStreamWriter, which provides an XML
- writer with a simple streaming API. QXmlStreamWriter operates on a
- QIODevice and has specialised functions for all XML tokens or events you
- want to write, such as \l{QXmlStreamWriter::writeDTD()}{writeDTD()},
- \l{QXmlStreamWriter::writeCharacters()}{writeCharacters()},
- \l{QXmlStreamWriter::writeComment()}{writeComment()} and so on.
-
- To write XML document with QXmlStreamWriter, you start a document with the
- \l{QXmlStreamWriter::writeStartDocument()}{writeStartDocument()} function
- and end it with \l{QXmlStreamWriter::writeEndDocument()}
- {writeEndDocument()}, which implicitly closes all remaining open tags.
- Element tags are opened with \l{QXmlStreamWriter::writeStartDocument()}
- {writeStartDocument()} and followed by
- \l{QXmlStreamWriter::writeAttribute()}{writeAttribute()} or
- \l{QXmlStreamWriter::writeAttributes()}{writeAttributes()},
- element content, and then \l{QXmlStreamWriter::writeEndDocument()}
- {writeEndDocument()}. Also, \l{QXmlStreamWriter::writeEmptyElement()}
- {writeEmptyElement()} can be used to write empty elements.
-
- Element content comprises characters, entity references or nested elements.
- Content can be written with \l{QXmlStreamWriter::writeCharacters()}
- {writeCharacters()}, a function that also takes care of escaping all
- forbidden characters and character sequences,
- \l{QXmlStreamWriter::writeEntityReference()}{writeEntityReference()},
- or subsequent calls to \l{QXmlStreamWriter::writeStartElement()}
- {writeStartElement()}.
-
- The \c XbelWriter class from \l{QXmlStream Bookmarks Example} is a subclass
- of QXmlStreamWriter. Its \c writeFile() function illustrates the core
- functions of QXmlStreamWriter mentioned above:
-
- \snippet examples/xml/streambookmarks/xbelwriter.cpp 1
-
- \section1 The Qt SAX2 Classes
-
- \section2 Introduction to SAX2
-
- The SAX2 interface is an event-driven mechanism to provide the user with
- document information. An "event" in this context means something
- reported by the parser, for example, it has encountered a start tag,
- or an end tag, etc.
-
- To make it less abstract consider the following example:
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 3
-
- Whilst reading (a SAX2 parser is usually referred to as "reader")
- the above document three events would be triggered:
- \list 1
- \o A start tag occurs (\c{<quote>}).
- \o Character data (i.e. text) is found, "A quotation.".
- \o An end tag is parsed (\c{</quote>}).
- \endlist
-
- Each time such an event occurs the parser reports it; you can set up
- event handlers to respond to these events.
-
- Whilst this is a fast and simple approach to read XML documents,
- manipulation is difficult because data is not stored, simply handled
- and discarded serially. The \link #dom DOM interface
- \endlink reads in and stores the whole document in a tree structure;
- this takes more memory, but makes it easier to manipulate the
- document's structure..
-
- The Qt XML module provides an abstract class, \l QXmlReader, that
- defines the interface for potential SAX2 readers. Qt includes a reader
- implementation, \l QXmlSimpleReader, that is easy to adapt through
- subclassing.
-
- The reader reports parsing events through special handler classes:
- \table
- \header \o Handler class \o Description
- \row \o \l QXmlContentHandler
- \o Reports events related to the content of a document (e.g. the start tag
- or characters).
- \row \o \l QXmlDTDHandler
- \o Reports events related to the DTD (e.g. notation declarations).
- \row \o \l QXmlErrorHandler
- \o Reports errors or warnings that occurred during parsing.
- \row \o \l QXmlEntityResolver
- \o Reports external entities during parsing and allows users to resolve
- external entities themselves instead of leaving it to the reader.
- \row \o \l QXmlDeclHandler
- \o Reports further DTD related events (e.g. attribute declarations).
- \row \o \l QXmlLexicalHandler
- \o Reports events related to the lexical structure of the
- document (the beginning of the DTD, comments etc.).
- \endtable
-
- These classes are abstract classes describing the interface. The \l
- QXmlDefaultHandler class provides a "do nothing" default
- implementation for all of them. Therefore users only need to overload
- the QXmlDefaultHandler functions they are interested in.
-
- To read input XML data a special class \l QXmlInputSource is used.
-
- Apart from those already mentioned, the following SAX2 support classes
- provide additional useful functionality:
- \table
- \header \o Class \o Description
- \row \o \l QXmlAttributes
- \o Used to pass attributes in a start element event.
- \row \o \l QXmlLocator
- \o Used to obtain the actual parsing position of an event.
- \row \o \l QXmlNamespaceSupport
- \o Used to implement namespace support for a reader. Note that
- namespaces do not change the parsing behavior. They are only
- reported through the handler.
- \endtable
-
- The \l{SAX Bookmarks example} illustrates how to subclass
- QXmlDefaultHandler to read an XML bookmark file (XBEL) and
- how to generate XML by hand.
-
- \section2 SAX2 Features
-
- The behavior of an XML reader depends on its support for certain
- optional features. For example, a reader may have the feature "report
- attributes used for namespace declarations and prefixes along with
- the local name of a tag". Like every other feature this has a unique
- name represented by a URI: it is called
- \e http://xml.org/sax/features/namespace-prefixes.
-
- The Qt SAX2 implementation can report whether the reader has
- particular functionality using the QXmlReader::hasFeature()
- function. Available features can be tested with QXmlReader::feature(),
- and switched on or off using QXmlReader::setFeature().
-
- Consider the example
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 4
- A reader that does not support the \e
- http://xml.org/sax/features/namespace-prefixes feature would report
- the element name \e document but not its attributes \e xmlns:book and
- \e xmlns with their values. A reader with the feature \e
- http://xml.org/sax/features/namespace-prefixes reports the namespace
- attributes if the \link QXmlReader::feature() feature\endlink is
- switched on.
-
- Other features include \e http://xml.org/sax/features/namespace
- (namespace processing, implies \e
- http://xml.org/sax/features/namespace-prefixes) and \e
- http://xml.org/sax/features/validation (the ability to report
- validation errors).
-
- Whilst SAX2 leaves it to the user to define and implement whatever
- features are required, support for \e
- http://xml.org/sax/features/namespace (and thus \e
- http://xml.org/sax/features/namespace-prefixes) is mandantory.
- The \l QXmlSimpleReader implementation of \l QXmlReader,
- supports them, and can do namespace processing.
-
- \l QXmlSimpleReader is not validating, so it
- does not support \e http://xml.org/sax/features/validation.
-
- \section2 Namespace Support via Features
-
- As we have seen in the previous section, we can configure the
- behavior of the reader when it comes to namespace
- processing. This is done by setting and unsetting the
- \e http://xml.org/sax/features/namespaces and
- \e http://xml.org/sax/features/namespace-prefixes features.
-
- They influence the reporting behavior in the following way:
- \list 1
- \o Namespace prefixes and local parts of elements and attributes can
- be reported.
- \o The qualified names of elements and attributes are reported.
- \o \l QXmlContentHandler::startPrefixMapping() and \l
- QXmlContentHandler::endPrefixMapping() are called by the reader.
- \o Attributes that declare namespaces (i.e. the attribute \e xmlns and
- attributes starting with \e{xmlns:}) are reported.
- \endlist
-
- Consider the following element:
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 5
- With \e http://xml.org/sax/features/namespace-prefixes set to true
- the reader will report four attributes; but with the \e
- namespace-prefixes feature set to false only three, with the \e
- xmlns:fnord attribute defining a namespace being "invisible" to the
- reader.
-
- The \e http://xml.org/sax/features/namespaces feature is responsible
- for reporting local names, namespace prefixes and URIs. With \e
- http://xml.org/sax/features/namespaces set to true the parser will
- report \e title as the local name of the \e fnord:title attribute, \e
- fnord being the namespace prefix and \e http://example.com/fnord/ as
- the namespace URI. When \e http://xml.org/sax/features/namespaces is
- false none of them are reported.
-
- In the current implementation the Qt XML classes follow the definition
- that the prefix \e xmlns itself isn't associated with any namespace at all
- (see \link http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-using
- http://www.w3.org/TR/1999/REC-xml-names-19990114/#ns-using \endlink).
- Therefore even with \e http://xml.org/sax/features/namespaces and
- \e http://xml.org/sax/features/namespace-prefixes both set to true
- the reader won't return either a local name, a namespace prefix or
- a namespace URI for \e xmlns:fnord.
-
- This might be changed in the future following the W3C suggestion
- \link http://www.w3.org/2000/xmlns/ http://www.w3.org/2000/xmlns/ \endlink
- to associate \e xmlns with the namespace \e http://www.w3.org/2000/xmlns.
-
- As the SAX2 standard suggests, \l QXmlSimpleReader defaults to having
- \e http://xml.org/sax/features/namespaces set to true and
- \e http://xml.org/sax/features/namespace-prefixes set to false.
- When changing this behavior using \l QXmlSimpleReader::setFeature()
- note that the combination of both features set to
- false is illegal.
-
- \section3 Summary
-
- \l QXmlSimpleReader implements the following behavior:
-
- \table
- \header \o (namespaces, namespace-prefixes)
- \o Namespace prefix and local part
- \o Qualified names
- \o Prefix mapping
- \o xmlns attributes
- \row \o (true, false) \o Yes \o Yes* \o Yes \o No
- \row \o (true, true) \o Yes \o Yes \o Yes \o Yes
- \row \o (false, true) \o No* \o Yes \o No* \o Yes
- \row \o (false, false) \i41 Illegal
- \endtable
-
- The behavior of the entries marked with an asterisk (*) is not specified by SAX.
-
- \section2 Properties
-
- Properties are a more general concept. They have a unique name,
- represented as an URI, but their value is \c void*. Thus nearly
- anything can be used as a property value. This concept involves some
- danger, though: there is no means of ensuring type-safety; the user
- must take care that they pass the right type. Properties are
- useful if a reader supports special handler classes.
-
- The URIs used for features and properties often look like URLs, e.g.
- \c http://xml.org/sax/features/namespace. This does not mean that the
- data required is at this address. It is simply a way of defining
- unique names.
-
- Anyone can define and use new SAX2 properties for their readers.
- Property support is not mandatory.
-
- To set or query properties the following functions are provided: \l
- QXmlReader::setProperty(), \l QXmlReader::property() and \l
- QXmlReader::hasProperty().
-
-
- \target dom
- \section1 The Qt DOM Classes
-
- \target domIntro
- \section2 Introduction to DOM
-
- DOM provides an interface to access and change the content and
- structure of an XML file. It makes a hierarchical view of the document
- (a tree view). Thus -- in contrast to the SAX2 interface -- an object
- model of the document is resident in memory after parsing which makes
- manipulation easy.
-
- All DOM nodes in the document tree are subclasses of \l QDomNode. The
- document itself is represented as a \l QDomDocument object.
-
- Here are the available node classes and their potential child classes:
-
- \list
- \o \l QDomDocument: Possible children are
- \list
- \o \l QDomElement (at most one)
- \o \l QDomProcessingInstruction
- \o \l QDomComment
- \o \l QDomDocumentType
- \endlist
- \o \l QDomDocumentFragment: Possible children are
- \list
- \o \l QDomElement
- \o \l QDomProcessingInstruction
- \o \l QDomComment
- \o \l QDomText
- \o \l QDomCDATASection
- \o \l QDomEntityReference
- \endlist
- \o \l QDomDocumentType: No children
- \o \l QDomEntityReference: Possible children are
- \list
- \o \l QDomElement
- \o \l QDomProcessingInstruction
- \o \l QDomComment
- \o \l QDomText
- \o \l QDomCDATASection
- \o \l QDomEntityReference
- \endlist
- \o \l QDomElement: Possible children are
- \list
- \o \l QDomElement
- \o \l QDomText
- \o \l QDomComment
- \o \l QDomProcessingInstruction
- \o \l QDomCDATASection
- \o \l QDomEntityReference
- \endlist
- \o \l QDomAttr: Possible children are
- \list
- \o \l QDomText
- \o \l QDomEntityReference
- \endlist
- \o \l QDomProcessingInstruction: No children
- \o \l QDomComment: No children
- \o \l QDomText: No children
- \o \l QDomCDATASection: No children
- \o \l QDomEntity: Possible children are
- \list
- \o \l QDomElement
- \o \l QDomProcessingInstruction
- \o \l QDomComment
- \o \l QDomText
- \o \l QDomCDATASection
- \o \l QDomEntityReference
- \endlist
- \o \l QDomNotation: No children
- \endlist
-
- With \l QDomNodeList and \l QDomNamedNodeMap two collection classes
- are provided: \l QDomNodeList is a list of nodes,
- and \l QDomNamedNodeMap is used to handle unordered sets of nodes
- (often used for attributes).
-
- The \l QDomImplementation class allows the user to query features of the
- DOM implementation.
-
- To get started please refer to the \l QDomDocument documentation.
- You might also want to take a look at the \l{DOM Bookmarks example},
- which illustrates how to read and write an XML bookmark file (XBEL)
- using DOM.
-
- \target namespaces
- \section1 An Introduction to Namespaces
-
- Parts of the Qt XML module documentation assume that you are familiar
- with XML namespaces. Here we present a brief introduction; skip to
- \link #namespacesConventions Qt XML documentation conventions \endlink
- if you already know this material.
-
- Namespaces are a concept introduced into XML to allow a more modular
- design. With their help data processing software can easily resolve
- naming conflicts in XML documents.
-
- Consider the following example:
-
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 6
-
- Here we find three different uses of the name \e title. If you wish to
- process this document you will encounter problems because each of the
- \e titles should be displayed in a different manner -- even though
- they have the same name.
-
- The solution would be to have some means of identifying the first
- occurrence of \e title as the title of a book, i.e. to use the \e
- title element of a book namespace to distinguish it from, for example,
- the chapter title, e.g.:
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 7
-
- \e book in this case is a \e prefix denoting the namespace.
-
- Before we can apply a namespace to element or attribute names we must
- declare it.
-
- Namespaces are URIs like \e http://example.com/fnord/book/. This
- does not mean that data must be available at this address; the URI is
- simply used to provide a unique name.
-
- We declare namespaces in the same way as attributes; strictly speaking
- they \e are attributes. To make for example \e
- http://example.com/fnord/ the document's default XML namespace \e
- xmlns we write
-
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 8
-
- To distinguish the \e http://example.com/fnord/book/ namespace from
- the default, we must supply it with a prefix:
-
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 9
-
- A namespace that is declared like this can be applied to element and
- attribute names by prepending the appropriate prefix and a ":"
- delimiter. We have already seen this with the \e book:title element.
-
- Element names without a prefix belong to the default namespace. This
- rule does not apply to attributes: an attribute without a prefix does
- not belong to any of the declared XML namespaces at all. Attributes
- always belong to the "traditional" namespace of the element in which
- they appear. A "traditional" namespace is not an XML namespace, it
- simply means that all attribute names belonging to one element must be
- different. Later we will see how to assign an XML namespace to an
- attribute.
-
- Due to the fact that attributes without prefixes are not in any XML
- namespace there is no collision between the attribute \e title (that
- belongs to the \e author element) and for example the \e title element
- within a \e chapter.
-
- Let's clarify this with an example:
- \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 10
-
- Within the \e document element we have two namespaces declared. The
- default namespace \e http://example.com/fnord/ applies to the \e
- book element, the \e chapter element, the appropriate \e title element
- and of course to \e document itself.
-
- The \e book:author and \e book:title elements belong to the namespace
- with the URI \e http://example.com/fnord/book/.
-
- The two \e book:author attributes \e title and \e name have no XML
- namespace assigned. They are only members of the "traditional"
- namespace of the element \e book:author, meaning that for example two
- \e title attributes in \e book:author are forbidden.
-
- In the above example we circumvent the last rule by adding a \e title
- attribute from the \e http://example.com/fnord/ namespace to \e
- book:author: the \e fnord:title comes from the namespace with the
- prefix \e fnord that is declared in the \e book:author element.
-
- Clearly the \e fnord namespace has the same namespace URI as the
- default namespace. So why didn't we simply use the default namespace
- we'd already declared? The answer is quite complex:
- \list
- \o attributes without a prefix don't belong to any XML namespace at
- all, not even to the default namespace;
- \o additionally omitting the prefix would lead to a \e title-title clash;
- \o writing it as \e xmlns:title would declare a new namespace with the
- prefix \e title instead of applying the default \e xmlns namespace.
- \endlist
-
- With the Qt XML classes elements and attributes can be accessed in two
- ways: either by refering to their qualified names consisting of the
- namespace prefix and the "real" name (or \e local name) or by the
- combination of local name and namespace URI.
-
- More information on XML namespaces can be found at
- \l http://www.w3.org/TR/REC-xml-names/.
-
-
- \target namespacesConventions
- \section2 Conventions Used in the Qt XML Documentation
-
- The following terms are used to distinguish the parts of names within
- the context of namespaces:
- \list
- \o The \e {qualified name}
- is the name as it appears in the document. (In the above example \e
- book:title is a qualified name.)
- \o A \e {namespace prefix} in a qualified name
- is the part to the left of the ":". (\e book is the namespace prefix in
- \e book:title.)
- \o The \e {local part} of a name (also refered to as the \e {local
- name}) appears to the right of the ":". (Thus \e title is the
- local part of \e book:title.)
- \o The \e {namespace URI} ("Uniform Resource Identifier") is a unique
- identifier for a namespace. It looks like a URL
- (e.g. \e http://example.com/fnord/ ) but does not require
- data to be accessible by the given protocol at the named address.
- \endlist
-
- Elements without a ":" (like \e chapter in the example) do not have a
- namespace prefix. In this case the local part and the qualified name
- are identical (i.e. \e chapter).
-
- \sa {DOM Bookmarks Example}, {SAX Bookmarks Example}
-*/