XMLDocumentParser::XMLDocumentParser(DocumentFragment* fragment, Element* parentElement, FragmentScriptingPermission permission) : ScriptableDocumentParser(fragment->document()) , m_view(0) , m_wroteText(false) , m_currentNode(fragment) , m_sawError(false) , m_sawCSS(false) , m_sawXSLTransform(false) , m_sawFirstElement(false) , m_isXHTMLDocument(false) #if ENABLE(XHTMLMP) , m_isXHTMLMPDocument(false) , m_hasDocTypeDeclaration(false) #endif , m_parserPaused(false) , m_requestingScript(false) , m_finishCalled(false) , m_errorCount(0) , m_lastErrorPosition(TextPosition1::belowRangePosition()) , m_pendingScript(0) , m_scriptStartPosition(TextPosition1::belowRangePosition()) , m_parsingFragment(true) , m_scriptingPermission(permission) { fragment->ref(); // Add namespaces based on the parent node Vector<Element*> elemStack; while (parentElement) { elemStack.append(parentElement); Node* n = parentElement->parentNode(); if (!n || !n->isElementNode()) break; parentElement = static_cast<Element*>(n); } if (elemStack.isEmpty()) return; QXmlStreamNamespaceDeclarations namespaces; for (Element* element = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) { if (NamedNodeMap* attrs = element->attributes()) { for (unsigned i = 0; i < attrs->length(); i++) { Attribute* attr = attrs->attributeItem(i); if (attr->localName() == "xmlns") m_defaultNamespaceURI = attr->value(); else if (attr->prefix() == "xmlns") namespaces.append(QXmlStreamNamespaceDeclaration(attr->localName(), attr->value())); } } } m_stream.addExtraNamespaceDeclarations(namespaces); m_stream.setEntityResolver(new EntityResolver); // If the parent element is not in document tree, there may be no xmlns attribute; just default to the parent's namespace. if (m_defaultNamespaceURI.isNull() && !parentElement->inDocument()) m_defaultNamespaceURI = parentElement->namespaceURI(); }
void RssParser::dataAvailable(int id) { // Checking if we have already set the IO device for the reader if (m_reader.device() != reply(id)) { m_reader.setDevice(reply(id)); } // Reads data that has just arrived and parses it while (!m_reader.atEnd()) { switch (m_status) { case States::NotStarted: startReadingDocument(); break; case States::Started: readTag("rss", States::RssRead); break; case States::RssRead: // Here we store prefixes for namespaces we know. { const QXmlStreamNamespaceDeclarations namespaces = m_reader.namespaceDeclarations(); for (auto it = namespaces.constBegin(); it != namespaces.constEnd(); ++it) { if (it->namespaceUri() == "http://purl.org/dc/elements/1.1/") { m_dcNamespacePrefix = it->prefix().toString(); } } } readTag("channel", States::ReadingChannel); break; case States::ReadingChannel: readChannelInfo(); break; case States::ReadingNews: readItemInfo(); break; case States::FinishedReadingChannel: readClosingRssTag(); break; case States::FinishedReadingRss: readEndDocument(); break; case States::DocumentFinished: break; } } if ((m_reader.hasError()) && (m_reader.error() != QXmlStreamReader::PrematureEndOfDocumentError)) { // An error occurred, ending here m_channelUpdater->allNewsReceived(false, QObject::tr("Error parsing rss document: ") + m_reader.errorString()); } // If we have finished reading the document, resetting internal state if (m_status == States::DocumentFinished) { m_status = States::NotStarted; m_openedTags.clear(); m_channelCategories.clear(); } }
void NamespaceSupport::setPrefixes(const QXmlStreamNamespaceDeclarations &declarations) { for (int i = 0; i < declarations.count(); i++) { const QXmlStreamNamespaceDeclaration declaration = declarations.at(i); const QXmlName::PrefixCode prefixCode = m_namePool->allocatePrefix(declaration.prefix().toString()); const QXmlName::NamespaceCode namespaceCode = m_namePool->allocateNamespace(declaration.namespaceUri().toString()); m_ns.insert(prefixCode, namespaceCode); } }
XMLDocumentParser::XMLDocumentParser(DocumentFragment* fragment, Element* parentElement, ParserContentPolicy parserContentPolicy) : ScriptableDocumentParser(fragment->document(), parserContentPolicy) , m_view(0) , m_wroteText(false) , m_currentNode(fragment) , m_sawError(false) , m_sawCSS(false) , m_sawXSLTransform(false) , m_sawFirstElement(false) , m_isXHTMLDocument(false) , m_parserPaused(false) , m_requestingScript(false) , m_finishCalled(false) , m_xmlErrors(fragment->document()) , m_pendingScript(0) , m_scriptStartPosition(TextPosition::belowRangePosition()) , m_parsingFragment(true) { fragment->ref(); // Add namespaces based on the parent node Vector<Element*> elemStack; while (parentElement) { elemStack.append(parentElement); Node* n = parentElement->parentNode(); if (!n || !n->isElementNode()) break; parentElement = toElement(n); } if (elemStack.isEmpty()) return; QXmlStreamNamespaceDeclarations namespaces; for (Element* element = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) { element->synchronizeAllAttributes(); if (const ElementData* attrs = element->elementData()) { for (unsigned i = 0; i < attrs->length(); i++) { const Attribute& attr = attrs->attributeAt(i); if (attr.localName() == "xmlns") m_defaultNamespaceURI = attr.value(); else if (attr.prefix() == "xmlns") namespaces.append(QXmlStreamNamespaceDeclaration(attr.localName(), attr.value())); } } } m_stream.addExtraNamespaceDeclarations(namespaces); m_stream.setEntityResolver(new EntityResolver); // If the parent element is not in document tree, there may be no xmlns attribute; just default to the parent's namespace. if (m_defaultNamespaceURI.isNull() && !parentElement->inDocument()) m_defaultNamespaceURI = parentElement->namespaceURI(); }
static inline void handleElementNamespaces(Element* newElement, const QXmlStreamNamespaceDeclarations &ns, ExceptionCode& ec) { for (int i = 0; i < ns.count(); ++i) { const QXmlStreamNamespaceDeclaration &decl = ns[i]; String namespaceURI = decl.namespaceUri(); String namespaceQName = decl.prefix().isEmpty() ? String("xmlns") : String("xmlns:") + decl.prefix(); newElement->setAttributeNS("http://www.w3.org/2000/xmlns/", namespaceQName, namespaceURI, ec); if (ec) // exception setting attributes return; } }
static inline void handleNamespaceAttributes(Vector<Attribute, 8>& prefixedAttributes, const QXmlStreamNamespaceDeclarations &ns, ExceptionCode& ec) { for (int i = 0; i < ns.count(); ++i) { const QXmlStreamNamespaceDeclaration &decl = ns[i]; String namespaceURI = decl.namespaceUri(); String namespaceQName = decl.prefix().isEmpty() ? String("xmlns") : String("xmlns:"); namespaceQName.append(decl.prefix()); QualifiedName parsedName = anyName; if (!Element::parseAttributeName(parsedName, XMLNSNames::xmlnsNamespaceURI, namespaceQName, ec)) return; prefixedAttributes.append(Attribute(parsedName, namespaceURI)); } }
XMLTokenizer::XMLTokenizer(DocumentFragment* fragment, Element* parentElement) : m_doc(fragment->document()) , m_view(0) , m_wroteText(false) , m_currentNode(fragment) , m_currentNodeIsReferenced(fragment) , m_sawError(false) , m_sawXSLTransform(false) , m_sawFirstElement(false) , m_isXHTMLDocument(false) , m_parserPaused(false) , m_requestingScript(false) , m_finishCalled(false) , m_errorCount(0) , m_lastErrorLine(0) , m_lastErrorColumn(0) , m_pendingScript(0) , m_scriptStartLine(0) , m_parsingFragment(true) { if (fragment) fragment->ref(); if (m_doc) m_doc->ref(); // Add namespaces based on the parent node Vector<Element*> elemStack; while (parentElement) { elemStack.append(parentElement); Node* n = parentElement->parentNode(); if (!n || !n->isElementNode()) break; parentElement = static_cast<Element*>(n); } if (elemStack.isEmpty()) return; #if QT_VERSION < 0x040400 for (Element* element = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) { if (NamedAttrMap* attrs = element->attributes()) { for (unsigned i = 0; i < attrs->length(); i++) { Attribute* attr = attrs->attributeItem(i); if (attr->localName() == "xmlns") m_defaultNamespaceURI = attr->value(); else if (attr->prefix() == "xmlns") m_prefixToNamespaceMap.set(attr->localName(), attr->value()); } } } #else QXmlStreamNamespaceDeclarations namespaces; for (Element* element = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) { if (NamedAttrMap* attrs = element->attributes()) { for (unsigned i = 0; i < attrs->length(); i++) { Attribute* attr = attrs->attributeItem(i); if (attr->localName() == "xmlns") m_defaultNamespaceURI = attr->value(); else if (attr->prefix() == "xmlns") namespaces.append(QXmlStreamNamespaceDeclaration(attr->localName(), attr->value())); } } } m_stream.addExtraNamespaceDeclarations(namespaces); m_stream.setEntityResolver(new EntityResolver); #endif // If the parent element is not in document tree, there may be no xmlns attribute; just default to the parent's namespace. if (m_defaultNamespaceURI.isNull() && !parentElement->inDocument()) m_defaultNamespaceURI = parentElement->namespaceURI(); }