QAbstractXmlNodeModel Class Reference

[QtXmlPatterns module]

该QAbstractXmlNodeModel类是模拟非XML数据看起来像XML作为一个抽象基类QXmlQueryMore…

通过继承QSimpleXmlNodeModel

Types

  • enum SimpleAxis { Parent, FirstChild, PreviousSibling, NextSibling }

Methods

  • __init__ (self)
  • list-of-QXmlNodeModelIndex attributes (self, QXmlNodeModelIndex element)
  • QUrl baseUri (self, QXmlNodeModelIndex ni)
  • QXmlNodeModelIndex.DocumentOrder compareOrder (self, QXmlNodeModelIndex ni1, QXmlNodeModelIndex ni2)
  • QXmlNodeModelIndex createIndex (self, int data)
  • QXmlNodeModelIndex createIndex (self, int data, int additionalData)
  • QXmlNodeModelIndex createIndex (self, object pointer, int additionalData = 0)
  • QUrl documentUri (self, QXmlNodeModelIndex ni)
  • QXmlNodeModelIndex elementById (self, QXmlName NCName)
  • QXmlNodeModelIndex.NodeKind kind (self, QXmlNodeModelIndex ni)
  • QXmlName name (self, QXmlNodeModelIndex ni)
  • list-of-QXmlName namespaceBindings (self, QXmlNodeModelIndex n)
  • QXmlNodeModelIndex nextFromSimpleAxis (self, SimpleAxis axis, QXmlNodeModelIndex origin)
  • list-of-QXmlNodeModelIndex nodesByIdref (self, QXmlName NCName)
  • QXmlNodeModelIndex root (self, QXmlNodeModelIndex n)
  • QSourceLocation sourceLocation (self, QXmlNodeModelIndex index)
  • QString stringValue (self, QXmlNodeModelIndex n)
  • QVariant typedValue (self, QXmlNodeModelIndex n)

Detailed Description

该QAbstractXmlNodeModel类是模拟非XML数据看起来像XML作为一个抽象基类QXmlQuery

该QAbstractXmlNodeModel指定一个节点模型必须实现该节点模型的接口可以访问用于处理查询引擎XQuery查询。一个节点的模型数据表示为可查询,就好像数据是XML的结构。

通过QAbstractXmlNodeModel的子类表示的节点模型是指由被访问QtXmlPatterns查询引擎。如果API似乎有点怪在一些地方,这是因为成员函数是由查询引擎称为它的评估XQuery。它们并不意味着被编程使用。

Usage

QAbstractXmlNodeModel桥樑要查询的非XML数据的任意的结构和良好定义的由理解的XML数据的结构之间的间隙QXmlQuery

想想看,读取文件中的化学中的应用chemistryData,其中包含代表分子和原子组成的化学结构非XML数据。该应用程序将查询该化学数据与XQuery它从文件中读取queryFile。我们写QAbstractXmlNodeModel的自定义子类(ChemistryNodeModel)读取chemistryData并建立一个数据结构,也许是由我们自己的类的对象moleculeatom。显然,这种数据结构是不是XML。我们的自定义子类就知道如何遍历这个非XML结构,并通过展示它的XPath Data Model interface

  1. [QFile](qfile.html) queryFile(argv[1]);
  2. [QFile](qfile.html) chemistryData(argv[2]);
  3. [QString](qstring.html) moleculeName = argv[3];
  4. [QXmlQuery]($docs-qxmlquery.html) query;
  5. query.setQuery(&queryFile, [QUrl]($docs-qurl.html).fromLocalFile(queryFile.fileName()));
  6. ChemistryNodeModel myNodeModel(query.namePool(), chemistryData);
  7. [QXmlNodeModelIndex]($docs-qxmlnodemodelindex.html) startNode = myNodeModel.nodeFor(moleculeName);
  8. query.bindVariable("queryRoot", startNode);
  9. [QFile](qfile.html) out;
  10. out.open(stdout, [QIODevice](qiodevice.html).WriteOnly);
  11. [QXmlSerializer]($docs-qxmlserializer.html) serializer(query, &out);
  12. query.evaluateTo(&serializer);

应用程序首先创建的实例QXmlQuery并呼吁setQuery() to read queryFileXQuery我们要运行。然后,它创建了我们自定义的节点模型类的实例,ChemistryNodeModel,这是QAbstractXmlNodeModel的子类。它的构造函数被调用,name pool从我们获得的QXmlQuery以及与chemistryFile含分子和原子的待查询的结构。该name pool是必需的,因为我们的自定义节点模型具有成员函数name(),它返回name的模型中的任何节点。该query和自定义节点模型必须使用相同的名称池构造这些names。该构造函数将改为chemistryFile并建立自定义节点模型结构。

连接query到自定义节点模型,我们必须绑定在查询中使用到模型中的一个节点的变量名。该变量可以被用来在查询中作为起始节点。首先,将index为所需的起始节点被检索到通过调用QAbstractXmlNodeModel.createIndex( ) 。然后索引绑定到变量名,在此情况下queryRoot,通过将名字和索引QXmlQuery.bindVariable( ) 。然后,查询可以使用一个变量引用$queryRoot指起始节点。需要注意的是,如果query使用多个变量引用,调用QXmlQuery.bindVariable( )需要在每个不同的变量名称绑定到模型中的一个节点。

当应用程序调用的一个查询被执行QXmlQuery评价职能。该应用程序使用QXmlQuery.evaluateTo (QAbstractXmlReceiver ) ,因为它然后使用serializer到了查询结果作为XML来stdout。我们也可以使用QXmlQuery.evaluateTo (QXmlResultItems )来获取结果的项目,或QXmlQuery.evaluateTo列表(QStringList* )如果查询评估,以一序列xs:string值。

在查询执行时,引擎遍历节点模型使用nextFromSimpleAxis( )来获得index的下一个节点进行访问。该发动机可以通过调用得到一个节点的名称name( )与该节点的indexstringValue( )baseUri( )documentUri()和kind()根据需要与节点也被称为index

该示例演示了标准模式使用QAbstractXmlNodeModel的一个子类与组合QXmlQuery要执行的XQuery

  1. 实例QXmlQuery并给它XQuery要运行;
  2. 实例QAbstractXmlNodeModel的子类或QSimpleXmlNodeModel;
  3. 检索QXmlNodeModelIndex对于模型中的节点,其中QXmlQuery应开始查询;
  4. 使用QXmlQuery.bindVariable()来绑定QXmlNodeModelIndex$variable name;
  5. 呼叫之一QXmlQuery评价函数来执行查询。

Subclassing

因为XPath Data Model interface通过QAbstractXmlNodeModel允许提出QXmlQuery对非XML数据进行操作,就好像它是XML ,实施QAbstractXmlNodeModel的子类可以涉及一个显着的工作量。该QSimpleXmlNodeModel类提供简化的实施对于许多常见的用例。

Thread Safety

因为节点模型可以同时通过线程的访问QtXmlPatterns模块, QAbstractXmlNodeModel的子类必须被编写成thread-safe。能够简化执行的线程安全类包括QReadLockerQWriteLocker

请参阅示例File System Example演示。


Type Documentation

  1. QAbstractXmlNodeModel.SimpleAxis

四个轴,每个包含一个节点而已。

Constant Value Description
QAbstractXmlNodeModel.Parent 0 上下文节点的父
QAbstractXmlNodeModel.FirstChild 1 上下文节点的第一个孩子
QAbstractXmlNodeModel.PreviousSibling 2 上下文节点的上一个孩子
QAbstractXmlNodeModel.NextSibling 3 上下文节点的下一个子

Method Documentation

  1. QAbstractXmlNodeModel.__init__ (self)

默认构造函数。

  1. list-of-QXmlNodeModelIndex QAbstractXmlNodeModel.attributes (self, QXmlNodeModelIndex element)

这种方法是抽象的,应在任何子类中重新实现。

返回的属性element。调用者保证element是在该节点模型的元素。

  1. QUrl QAbstractXmlNodeModel.baseUri (self, QXmlNodeModelIndex ni)

[

这种方法是抽象的,应在任何子类中重新实现。

返回其索引节点的基URIn。调用者保证nnull并且,它属于在该节点模型的一个节点。

一个节点的基URI可使用提取出的fn:base-uri()功能。基URI通常用于解决出现在节点或它的孩子相对URI 。这是符合标准的,只是返回文档的URI ,尽管这可能无法正确反映基础数据。

这个函数映射到dm:base-uri访问器,根据下面的返回一个基URI :

  • For document nodes, the base URI and the document URI are the same.
  • For elements, the base URI is the URI appearing in the element’s xml:base attribute, if present, or it is resolved to the parent element’s base URI.
  • Namespace nodes have no base URI.
  • The base URI for a processing instruction, comment, attribute, or text node is the base URI of the node’s parent element.

]($docs-qurl.html)

实施保证返回一个有效的QUrl或默认构造QUrl。如果一个节点没有基URI ,如在注释没有家长的情况下,默认的构造QUrl返回。

See also XQuery 1.0 and XPath 2.0 Data Model (XDM), 5.2 base-uri Accessor

  1. QXmlNodeModelIndex.DocumentOrder QAbstractXmlNodeModel.compareOrder (self, QXmlNodeModelIndex ni1, QXmlNodeModelIndex ni2)

[

这种方法是抽象的,应在任何子类中重新实现。

该函数返回由索引节点的相对顺序文件ni1ni2。它被用于Is运营商和文档顺序排序节点。

调用者保证ni1ni2null并且这两个标识在这个节点模型节点。

]($docs-qxmlnodemodelindex.html#DocumentOrder-enum)

If ni1是相同的ni2QXmlNodeModelIndex.Is返回。如果ni1先于ni2按文档顺序,QXmlNodeModelIndex.Precedes返回。如果ni1 follows ni2按文档顺序,QXmlNodeModelIndex.Follows返回。

See also XQuery 1.0 and XPath 2.0 Data Model (XDM), 2.4 Document Order

  1. QXmlNodeModelIndex QAbstractXmlNodeModel.createIndex (self, int data)

[

创建一个具有节点索引data作为它的内部数据。data没有限制。

]($docs-qxmlnodemodelindex.html)

  1. QXmlNodeModelIndex QAbstractXmlNodeModel.createIndex (self, int data, int additionalData)

[

创建一个具有节点索引pointeradditionalData作为它的内部数据。

什么pointeradditionalData是,不是限制。

]($docs-qxmlnodemodelindex.html)

  1. QXmlNodeModelIndex QAbstractXmlNodeModel.createIndex (self, object pointer, int additionalData = 0)

[

这是一个重载函数。

]($docs-qxmlnodemodelindex.html)

创建QXmlNodeModelIndex containing dataadditionalData

  1. QUrl QAbstractXmlNodeModel.documentUri (self, QXmlNodeModelIndex ni)

[

这种方法是抽象的,应在任何子类中重新实现。

返回的文档URIn。该文件的URI标识的是该文件的资源。例如,该文件可能是一个普通文件,例如:file:/或者它可以是http://一个文件的位置的URL。该文件的URI用于解析URI和简单地知道该文件是。

如果节点模型映射到URI以自然的方式,返回的URI 。否则,返回公司或产品的URI 。文档的URI可以是任意的URI ,只要其有效和绝对的。

]($docs-qurl.html)

调用者保证nnull并且,它属于本QAbstractXmlNodeModel

这个函数映射到dm:document-uri访问器,根据下面的返回一个文件的URI :

  • If n is a document node, return an absolute QUrl containing the document URI, or a default constructed QUrl. The latter signals that no document URI is available for the document node.
  • For all other nodes, return a default constructed QUrl.

See also XQuery 1.0 and XPath 2.0 Data Model (XDM), 5.4 document-uri AccessorQUrl.isValid()和QUrl.isRelative( ) 。

  1. QXmlNodeModelIndex QAbstractXmlNodeModel.elementById (self, QXmlName NCName)

[

这种方法是抽象的,应在任何子类中重新实现。

]($docs-qxmlnodemodelindex.html)

返回标识为元素的索引idXQueryid()函数调用这个函数。

返回的节点的索引将其值类型的元素节点ID和equalsid,或者这将是一个具有属性,其类型化值的类型的元素节点ID和equalsid。如果不存在这样的元素,一个默认的构造QXmlNodeModelIndex实例返回。实现者保证,如果返回的节点的索引不为空,它标识元素。

它是不足够的,以只被称为属性或元素id。它的值类型也必须是ID。然而,保留的名称xml:id就足够了。

In id时,namespace URIprefix是不确定的,并且local name是应该抬头的ID。

See also XQuery 1.0 and XPath 2.0 Functions and Operators, 15.5.2 fn:id

  1. QXmlNodeModelIndex.NodeKind QAbstractXmlNodeModel.kind (self, QXmlNodeModelIndex ni)

[

这种方法是抽象的,应在任何子类中重新实现。

返回一个值,指示确定了节点的类型ni。调用者保证ni不为null ,并且它标识了此节点模型的节点。这个函数映射到dm:node-kind()访问。

]($docs-qxmlnodemodelindex.html#NodeKind-enum)

See also XQuery 1.0 and XPath 2.0 Data Model (XDM), 5.10 node-kind Accessor

  1. QXmlName QAbstractXmlNodeModel.name (self, QXmlNodeModelIndex ni)

[

这种方法是抽象的,应在任何子类中重新实现。

]($docs-qxmlname.html)

返回的名称ni。调用者保证ninull并且,它属于本QAbstractXmlNodeModel

如果一个节点没有一个名称,例如,注释节点,空QXmlName返回。 QXmlNames必须的实例被创建QXmlQuery正被用于使用这个评估查询QAbstractXmlNodeModel

这个函数映射到dm:node-name()访问。

If ni是一个处理指令,一个QXmlName返回的本地名称作为目标名称和命名空间URI和前缀都为空。

See also XQuery 1.0 and XPath 2.0 Data Model (XDM), 5.11 node-name AccessorQXmlName

  1. list-of-QXmlName QAbstractXmlNodeModel.namespaceBindings (self, QXmlNodeModelIndex n)

这种方法是抽象的,应在任何子类中重新实现。

返回在范围的命名空间n。调用者保证nnull并且,它属于本QAbstractXmlNodeModel

此功能对应的dm:namespace-nodes访问。

命名空间声明的返回向量包括的祖先命名空间n

调用者保证n是属于这样的一个元素QAbstractXmlNodeModel

  1. QXmlNodeModelIndex QAbstractXmlNodeModel.nextFromSimpleAxis (self, SimpleAxis axis, QXmlNodeModelIndex origin)

[

这种方法是抽象的,应在任何子类中重新实现。

]($docs-qxmlnodemodelindex.html)

When QtXmlPatterns计算路径表达式,它效仿他们通过电话的结合QSimpleXmlNodeModel.SimpleAxis值。因此,该功能的实现必须返回该节点,如果有的话,就出现axis从发出origin

如果没有这样的节点可用,默认的构造QXmlNodeModelIndex返回。

QSimpleXmlNodeModel无需通过保证它永远不会要求来处理多馀的边角情况:

  • Children or siblings for attributes.
  • Children for comments, processing instructions, and text nodes.
  • Siblings or parents for document nodes.

一个典型的实现执行switch上的值axis

  1. [QXmlNodeModelIndex]($docs-qxmlnodemodelindex.html) MyTreeModel.nextFromSimpleAxis(SimpleAxis axis, const [QXmlNodeModelIndex]($docs-qxmlnodemodelindex.html) &origin) const
  2. {
  3. // Convert the QXmlNodeModelIndex to a value that is specific to what we represent.
  4. const MyValue value = toMyValue(ni);
  5. switch(axis)
  6. {
  7. case Parent:
  8. return toNodeIndex(value.parent());
  9. case FirstChild:
  10. case PreviousSibling:
  11. case NextSibling:
  12. // and so on
  13. }
  14. }
  1. list-of-QXmlNodeModelIndex QAbstractXmlNodeModel.nodesByIdref (self, QXmlName NCName)

这种方法是抽象的,应在任何子类中重新实现。

返回具有一个元素和/或属性IDREF值等于idrefXQueryidref()函数调用这个函数。

实现者保证所确定的返回索引节点是元素或属性。

它是不足够的,以只被称为属性或元素idref。它也必须是类型IDREF。元素必须键入为xs:IDREF or xs:IDREFS或者,在属性的情况下,如IDREF or IDREFS在架构中。

In idref时,namespace URIprefix是不确定的,并且local name是应该抬头的ID。

See also XQuery 1.0 and XPath 2.0 Functions and Operators, 15.5.3 fn:idref

  1. QXmlNodeModelIndex QAbstractXmlNodeModel.root (self, QXmlNodeModelIndex n)

[

这种方法是抽象的,应在任何子类中重新实现。

返回该树包含其索引是该节点的根节点n。调用者保证nnull而且它标识了此节点模型的节点。

]($docs-qxmlnodemodelindex.html)

If n标识一个节点是根,父母的直接子( )将返回相同的QXmlNodeModelIndex这个函数返回。

  1. QSourceLocation QAbstractXmlNodeModel.sourceLocation (self, QXmlNodeModelIndex index)

与给定返回该对象的源位置index或默认构造QSourceLocation在任何情况下,位置信息是可用的。

此功能被引入Qt的4.6 。

  1. QString QAbstractXmlNodeModel.stringValue (self, QXmlNodeModelIndex n)

这种方法是抽象的,应在任何子类中重新实现。

返回节点的字符串值n

调用者保证nnull而且它属于此QAbstractXmlNodeModel实例。

这个函数映射到dm:string-value()访问器,其规格完全指定。这里有一个总结:

  • For processing instructions, the string value is the data section(excluding any whitespace appearing between the name and the data).
  • For text nodes, the string value equals the text node.
  • For comments, the content of the comment
  • For elements, the concatenation of all text nodes that are descendants. Note, this is not only the children, but the childrens’ childrens’ text nodes, and so forth.
  • For document nodes, the concatenation of all text nodes in the document.

See also XQuery 1.0 and XPath 2.0 Data Model (XDM), 5.13 string-value Accessor

  1. QVariant QAbstractXmlNodeModel.typedValue (self, QXmlNodeModelIndex n)

这种方法是抽象的,应在任何子类中重新实现。

返回节点的类型值node

类型化值是原子值,该元素或属性包含。

调用者保证node或者是一个元素或属性。返回的实施者担保QVariant有被支撑在一个值XQuery。它不能是任意的QVariant值。实现者也保证stringValue()返回的TypedValue的词汇表示( ) (这是由担保QSimpleXmlNodeModel.stringValue())。

如果返回的QVariant是一个默认的构造变形,它预示着,node没有类型化值。