QXmlQuery Class

The QXmlQuery class performs XQueries on XML data, or on non-XML data modeled to look like XML. More...

Header: #include <QXmlQuery>
qmake: QT += xmlpatterns
Since: Qt 4.4

This class was introduced in Qt 4.4.

Note: All functions in this class are reentrant.

Public Types

enum QueryLanguage { XQuery10, XSLT20 }

Detailed Description

The QXmlQuery class compiles and executes queries written in the XQuery language. QXmlQuery is typically used to query XML data, but it can also query non-XML data that has been modeled to look like XML.

Using QXmlQuery to query XML data, as in the snippet below, is simple because it can use the built-in XML data model as its delegate to the underlying query engine for traversing the data. The built-in data model is specified in XQuery 1.0 and XPath 2.0 Data Model.

 QXmlQuery query;
 query.setQuery("doc('index.html')/html/body/p[1]");

 QXmlSerializer serializer(query, myOutputDevice);
 query.evaluateTo(&serializer);

The example uses QXmlQuery to match the first paragraph of an XML document and then output the result to a device as XML.

Using QXmlQuery to query non-XML data requires writing a subclass of QAbstractXmlNodeModel to use as a replacement for the built-in XML data model. The custom data model will be able to traverse the non-XML data as required by the QAbstractXmlNodeModel interface. An instance of this custom data model then becomes the delegate used by the query engine to traverse the non-XML data. For an example of how to use QXmlQuery to query non-XML data, see the documentation for QAbstractXmlNodeModel.

Running XQueries

To run a query set up with QXmlQuery, call one of the evaluation functions.

  • evaluateTo(QAbstractXmlReceiver *) is called with a pointer to an XML receiver, which receives the query results as a sequence of callbacks. The receiver callback class is like the callback class used for translating the output of a SAX parser. QXmlSerializer, for example, is a receiver callback class for translating the sequence of callbacks for output as unformatted XML text.
  • evaluateTo(QXmlResultItems *) is called with a pointer to an iterator for an empty sequence of query result items. The Java-like iterator allows the query results to be accessed sequentially.

Running XPath Expressions

The XPath language is a subset of the XQuery language, so running an XPath expression is the same as running an XQuery query. Pass the XPath expression to QXmlQuery using setQuery().

Running XSLT Stylesheets

Running an XSLT stylesheet is like running an XQuery, except that when you construct your QXmlQuery, you must pass QXmlQuery::XSLT20 to tell QXmlQuery to interpret whatever it gets from setQuery() as an XSLT stylesheet instead of as an XQuery. You must also set the input document by calling setFocus().

     QXmlQuery query(QXmlQuery::XSLT20);
     query.setFocus(QUrl("myInput.xml"));
     query.setQuery(QUrl("myStylesheet.xsl"));
     query.evaluateTo(out);

Note: Currently, setFocus() must be called before setQuery() when using XSLT.

Another way to run an XSLT stylesheet is to use the xmlpatterns command line utility.

 xmlpatterns myStylesheet.xsl myInput.xml

Note: For the current release, XSLT support should be considered experimental. See section XSLT conformance for details.

Stylesheet parameters are bound using bindVariable().

Binding A Query To A Starting Node

When a query is run on XML data, as in the snippet above, the doc() function returns the node in the built-in data model where the query evaluation will begin. But when a query is run on a custom node model containing non-XML data, one of the bindVariable() functions must be called to bind a variable name to a starting node in the custom model. A $variable reference is used in the XQuery text to access the starting node in the custom model. It is not necessary to declare the variable name external in the query. See the example in the documentation for QAbstractXmlNodeModel.

Reentrancy and Thread-Safety

QXmlQuery is reentrant but not thread-safe. It is safe to use the QxmlQuery copy constructor to create a copy of a query and run the same query multiple times. Behind the scenes, QXmlQuery will reuse resources such as opened files and compiled queries to the extent possible. But it is not safe to use the same instance of QXmlQuery in multiple threads.

Error Handling

Errors can occur during query evaluation. Examples include type errors and file loading errors. When an error occurs:

  • The error message is sent to the messageHandler().
  • QXmlResultItems::hasError() will return true, or evaluateTo() will return false;
  • The results of the evaluation are undefined.

Resource Management

When a query runs, it parses documents, allocating internal data structures to hold them, and it may load other resources over the network. It reuses these allocated resources when possible, to avoid having to reload and reparse them.

When setQuery() is called, the query text is compiled into an internal data structure and optimized. The optimized form can then be reused for multiple evaluations of the query. Since the compile-and-optimize process can be expensive, repeating it for the same query should be avoided by using a separate instance of QXmlQuery for each query text.

Once a document has been parsed, its internal representation is maintained in the QXmlQuery instance and shared among multiple QXmlQuery instances.

An instance of QCoreApplication must exist before QXmlQuery can be used.

Event Handling

When QXmlQuery accesses resources (e.g., calling fn:doc() to load a file, or accessing a device via a bound variable), the event loop is used, which means events will be processed. To avoid processing events when QXmlQuery accesses resources, create your QXmlQuery instance in a separate thread.

Member Type Documentation

enum QXmlQuery::QueryLanguage

Specifies whether you want QXmlQuery to interpret the input to setQuery() as an XQuery or as an XSLT stylesheet.

ConstantValueDescription
QXmlQuery::XQuery101XQuery 1.0.
QXmlQuery::XSLT202XSLT 2.0 The selector, the restricted XPath pattern found in W3C XML Schema 1.1 for uniqueness contraints. Apart from restricting the syntax, the type check stage for the expression assumes a sequence of nodes to be the focus. The field, the restricted XPath pattern found in W3C XML Schema 1.1 for uniqueness contraints. Apart from restricting the syntax, the type check stage for the expression assumes a sequence of nodes to be the focus. Signifies XPath 2.0. Has no effect in the public API, it's used internally. As With XmlSchema11IdentityConstraintSelector and XmlSchema11IdentityConstraintField, the type check stage for the expression assumes a sequence of nodes to be the focus.

This enum was introduced or modified in Qt 4.5.

See also setQuery().