/*! \internal Treats \a outputItem as a node and calls the appropriate function, e.g., attribute() or comment(), depending on its QXmlNodeModelIndex::NodeKind. This is a helper function that subclasses can use to multiplex Nodes received via item(). */ void QAbstractXmlReceiver::sendAsNode(const QPatternist::Item &outputItem) { Q_ASSERT(outputItem); Q_ASSERT(outputItem.isNode()); const QXmlNodeModelIndex asNode = outputItem.asNode(); switch(asNode.kind()) { case QXmlNodeModelIndex::Attribute: { const QString &v = outputItem.stringValue(); attribute(asNode.name(), QStringRef(&v)); return; } case QXmlNodeModelIndex::Element: { startElement(asNode.name()); /* First the namespaces, then attributes, then the children. */ asNode.sendNamespaces(this); sendFromAxis<QXmlNodeModelIndex::AxisAttribute>(asNode); sendFromAxis<QXmlNodeModelIndex::AxisChild>(asNode); endElement(); return; } case QXmlNodeModelIndex::Text: { const QString &v = asNode.stringValue(); characters(QStringRef(&v)); return; } case QXmlNodeModelIndex::ProcessingInstruction: { processingInstruction(asNode.name(), outputItem.stringValue()); return; } case QXmlNodeModelIndex::Comment: { comment(outputItem.stringValue()); return; } case QXmlNodeModelIndex::Document: { startDocument(); sendFromAxis<QXmlNodeModelIndex::AxisChild>(asNode); endDocument(); return; } case QXmlNodeModelIndex::Namespace: Q_ASSERT_X(false, Q_FUNC_INFO, "Not implemented"); } Q_ASSERT_X(false, Q_FUNC_INFO, QString::fromLatin1("Unknown node type: %1").arg(asNode.kind()).toUtf8().constData()); }
void QAbstractXmlReceiver::sendAsNode(const Item &outputItem) { Q_ASSERT(outputItem); Q_ASSERT(outputItem.isNode()); const QXmlNodeModelIndex asNode = outputItem.asNode(); switch(asNode.kind()) { case QXmlNodeModelIndex::Attribute: { attribute(asNode.name(), outputItem.stringValue()); break; } case QXmlNodeModelIndex::Element: { startElement(asNode.name()); /* First the namespaces, then attributes, then the children. */ asNode.sendNamespaces(Ptr(const_cast<QAbstractXmlReceiver *>(this))); sendFromAxis<QXmlNodeModelIndex::AxisAttribute>(asNode); sendFromAxis<QXmlNodeModelIndex::AxisChild>(asNode); endElement(); break; } case QXmlNodeModelIndex::Text: { characters(outputItem.stringValue()); break; } case QXmlNodeModelIndex::ProcessingInstruction: { processingInstruction(asNode.name(), outputItem.stringValue()); break; } case QXmlNodeModelIndex::Comment: { comment(outputItem.stringValue()); break; } case QXmlNodeModelIndex::Document: { sendFromAxis<QXmlNodeModelIndex::AxisChild>(asNode); break; } case QXmlNodeModelIndex::Namespace: Q_ASSERT_X(false, Q_FUNC_INFO, "Not implemented"); } }
QHash<QXmlName, QXmlItem> PullBridge::attributeItems() { Q_ASSERT(m_current == StartElement); QHash<QXmlName, QXmlItem> attributes; QXmlNodeModelIndex::Iterator::Ptr it = m_index.iterate(QXmlNodeModelIndex::AxisAttribute); QXmlNodeModelIndex index = it->next(); while (!index.isNull()) { const Item attribute(index); attributes.insert(index.name(), QXmlItem(index)); index = it->next(); } return attributes; }
void AccelTree::copyNodeTo(const QXmlNodeModelIndex &node, QAbstractXmlReceiver *const receiver, const NodeCopySettings &settings) const { /* This code piece can be seen as a customized version of * QAbstractXmlReceiver::item/sendAsNode(). */ Q_ASSERT(receiver); Q_ASSERT(!node.isNull()); typedef QHash<QXmlName::PrefixCode, QXmlName::NamespaceCode> Binding; QStack<Binding> outputted; switch(node.kind()) { case QXmlNodeModelIndex::Element: { outputted.push(Binding()); /* Add the namespace for our element name. */ const QXmlName elementName(node.name()); receiver->startElement(elementName); if(!settings.testFlag(InheritNamespaces)) receiver->namespaceBinding(QXmlName(StandardNamespaces::StopNamespaceInheritance, 0, StandardPrefixes::StopNamespaceInheritance)); if(settings.testFlag(PreserveNamespaces)) node.sendNamespaces(receiver); else { /* Find the namespaces that we actually use and add them to outputted. These are drawn * from the element name, and the node's attributes. */ outputted.top().insert(elementName.prefix(), elementName.namespaceURI()); const QXmlNodeModelIndex::Iterator::Ptr attributes(iterate(node, QXmlNodeModelIndex::AxisAttribute)); QXmlNodeModelIndex attr(attributes->next()); while(!attr.isNull()) { const QXmlName &attrName = attr.name(); outputted.top().insert(attrName.prefix(), attrName.namespaceURI()); attr = attributes->next(); } Binding::const_iterator it(outputted.top().constBegin()); const Binding::const_iterator end(outputted.top().constEnd()); for(; it != end; ++it) receiver->namespaceBinding(QXmlName(it.value(), 0, it.key())); } /* Send the attributes of the element. */ { QXmlNodeModelIndex::Iterator::Ptr attributes(node.iterate(QXmlNodeModelIndex::AxisAttribute)); QXmlNodeModelIndex attribute(attributes->next()); while(!attribute.isNull()) { const QString &v = attribute.stringValue(); receiver->attribute(attribute.name(), QStringRef(&v)); attribute = attributes->next(); } } /* Send the children of the element. */ copyChildren(node, receiver, settings); receiver->endElement(); outputted.pop(); break; } case QXmlNodeModelIndex::Document: { /* We need to intercept and grab the elements of the document node, such * that we preserve/inherit preference applies to them. */ receiver->startDocument(); copyChildren(node, receiver, settings); receiver->endDocument(); break; } default: receiver->item(node); } }