📄 qdom.cpp
字号:
// Variables QString m_sys; QString m_pub;};class QDomEntityPrivate : public QDomNodePrivate{public: QDomEntityPrivate(QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& name, const QString& pub, const QString& sys, const QString& notation); QDomEntityPrivate(QDomEntityPrivate* n, bool deep); // Reimplemented from QDomNodePrivate QDomNodePrivate* cloneNode(bool deep = true); virtual bool isEntity() const { return true; } QDomNode::NodeType nodeType() const { return QDomNode::EntityNode; } virtual void save(QTextStream& s, int, int) const; // Variables QString m_sys; QString m_pub; QString m_notationName;};class QDomEntityReferencePrivate : public QDomNodePrivate{public: QDomEntityReferencePrivate(QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& name); QDomEntityReferencePrivate(QDomNodePrivate* n, bool deep); // Reimplemented from QDomNodePrivate QDomNodePrivate* cloneNode(bool deep = true); bool isEntityReference() const { return true; } QDomNode::NodeType nodeType() const { return QDomNode::EntityReferenceNode; } virtual void save(QTextStream& s, int, int) const;};class QDomProcessingInstructionPrivate : public QDomNodePrivate{public: QDomProcessingInstructionPrivate(QDomDocumentPrivate*, QDomNodePrivate* parent, const QString& target, const QString& data); QDomProcessingInstructionPrivate(QDomProcessingInstructionPrivate* n, bool deep); // Reimplemented from QDomNodePrivate QDomNodePrivate* cloneNode(bool deep = true); virtual bool isProcessingInstruction() const { return true; } QDomNode::NodeType nodeType() const { return QDomNode::ProcessingInstructionNode; } virtual void save(QTextStream& s, int, int) const;};class QDomDocumentPrivate : public QDomNodePrivate{public: QDomDocumentPrivate(); QDomDocumentPrivate(const QString& name); QDomDocumentPrivate(QDomDocumentTypePrivate* dt); QDomDocumentPrivate(QDomDocumentPrivate* n, bool deep); ~QDomDocumentPrivate(); bool setContent(QXmlInputSource *source, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn); bool setContent(QXmlInputSource *source, QXmlReader *reader, QString *errorMsg, int *errorLine, int *errorColumn); // Attributes QDomDocumentTypePrivate* doctype() { return type; }; QDomImplementationPrivate* implementation() { return impl; }; QDomElementPrivate* documentElement(); // Factories QDomElementPrivate* createElement(const QString& tagName); QDomElementPrivate* createElementNS(const QString& nsURI, const QString& qName); QDomDocumentFragmentPrivate* createDocumentFragment(); QDomTextPrivate* createTextNode(const QString& data); QDomCommentPrivate* createComment(const QString& data); QDomCDATASectionPrivate* createCDATASection(const QString& data); QDomProcessingInstructionPrivate* createProcessingInstruction(const QString& target, const QString& data); QDomAttrPrivate* createAttribute(const QString& name); QDomAttrPrivate* createAttributeNS(const QString& nsURI, const QString& qName); QDomEntityReferencePrivate* createEntityReference(const QString& name); QDomNodePrivate* importNode(const QDomNodePrivate* importedNode, bool deep); // Reimplemented from QDomNodePrivate QDomNodePrivate* cloneNode(bool deep = true); bool isDocument() const { return true; } QDomNode::NodeType nodeType() const { return QDomNode::DocumentNode; } void clear(); // Variables QDomImplementationPrivate* impl; QDomDocumentTypePrivate* type; void saveDocument(QTextStream& stream, const int indent, QDomNode::EncodingPolicy encUsed) const;};/************************************************************** * * QDomHandler * **************************************************************/class QDomHandler : public QXmlDefaultHandler{public: QDomHandler(QDomDocumentPrivate* d, bool namespaceProcessing); ~QDomHandler(); // content handler bool endDocument(); bool startElement(const QString& nsURI, const QString& localName, const QString& qName, const QXmlAttributes& atts); bool endElement(const QString& nsURI, const QString& localName, const QString& qName); bool characters(const QString& ch); bool processingInstruction(const QString& target, const QString& data); bool skippedEntity(const QString& name); // error handler bool fatalError(const QXmlParseException& exception); // lexical handler bool startCDATA(); bool endCDATA(); bool startEntity(const QString &); bool endEntity(const QString &); bool startDTD(const QString& name, const QString& publicId, const QString& systemId); bool comment(const QString& ch); // decl handler bool externalEntityDecl(const QString &name, const QString &publicId, const QString &systemId) ; // DTD handler bool notationDecl(const QString & name, const QString & publicId, const QString & systemId); bool unparsedEntityDecl(const QString &name, const QString &publicId, const QString &systemId, const QString ¬ationName) ; void setDocumentLocator(QXmlLocator *locator); QString errorMsg; int errorLine; int errorColumn;private: QDomDocumentPrivate *doc; QDomNodePrivate *node; QString entityName; bool cdata; bool nsProcessing; QXmlLocator *locator;};/************************************************************** * * Functions for verifying legal data * **************************************************************/QDomImplementation::InvalidDataPolicy QDomImplementationPrivate::invalidDataPolicy = QDomImplementation::AcceptInvalidChars;// [5] Name ::= (Letter | '_' | ':') (NameChar)*static QString fixedXmlName(const QString &_name, bool *ok, bool namespaces = false){ QString name, prefix; if (namespaces) qt_split_namespace(prefix, name, _name, true); else name = _name; if (name.isEmpty()) { *ok = false; return QString(); } if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::AcceptInvalidChars) { *ok = true; return _name; } QString result; bool firstChar = true; for (int i = 0; i < name.size(); ++i) { QChar c = name.at(i); if (firstChar) { if (QXmlUtils::isLetter(c) || c.unicode() == '_' || c.unicode() == ':') { result.append(c); firstChar = false; } else if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } } else { if (QXmlUtils::isNameChar(c)) result.append(c); else if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { return QString(); *ok = false; } } } if (result.isEmpty()) { *ok = false; return QString(); } *ok = true; if (namespaces && !prefix.isEmpty()) return prefix + QLatin1Char(':') + result; return result;}// [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)// '<', '&' and "]]>" will be escaped when writingstatic QString fixedCharData(const QString &data, bool *ok){ if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::AcceptInvalidChars) { *ok = true; return data; } QString result; for (int i = 0; i < data.size(); ++i) { QChar c = data.at(i); if (QXmlUtils::isChar(c)) { result.append(c); } else if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } } *ok = true; return result;};// [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'// can't escape "--", since entities are not recognised within commentsstatic QString fixedComment(const QString &data, bool *ok){ if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::AcceptInvalidChars) { *ok = true; return data; } QString fixedData = fixedCharData(data, ok); if (!*ok) return QString(); for (;;) { int idx = fixedData.indexOf(QLatin1String("--")); if (idx == -1) break; if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } fixedData.remove(idx, 2); } *ok = true; return fixedData;}// [20] CData ::= (Char* - (Char* ']]>' Char*))// can't escape "]]>", since entities are not recognised within commentsstatic QString fixedCDataSection(const QString &data, bool *ok){ if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::AcceptInvalidChars) { *ok = true; return data; } QString fixedData = fixedCharData(data, ok); if (!*ok) return QString(); for (;;) { int idx = fixedData.indexOf(QLatin1String("]]>")); if (idx == -1) break; if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } fixedData.remove(idx, 3); } *ok = true; return fixedData;}// [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'static QString fixedPIData(const QString &data, bool *ok){ if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::AcceptInvalidChars) { *ok = true; return data; } QString fixedData = fixedCharData(data, ok); if (!*ok) return QString(); for (;;) { int idx = fixedData.indexOf(QLatin1String("?>")); if (idx == -1) break; if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } fixedData.remove(idx, 2); } *ok = true; return fixedData;}// [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"// The correct quote will be chosen when writingstatic QString fixedPubidLiteral(const QString &data, bool *ok){ if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::AcceptInvalidChars) { *ok = true; return data; } QString result; if(QXmlUtils::isPublicID(data)) result = data; else if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } if (result.indexOf(QLatin1Char('\'')) != -1 && result.indexOf(QLatin1Char('"')) != -1) { if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } else { result.remove(QLatin1Char('\'')); } } *ok = true; return result;}// [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")// The correct quote will be chosen when writingstatic QString fixedSystemLiteral(const QString &data, bool *ok){ if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::AcceptInvalidChars) { *ok = true; return data; } QString result = data; if (result.indexOf(QLatin1Char('\'')) != -1 && result.indexOf(QLatin1Char('"')) != -1) { if (QDomImplementationPrivate::invalidDataPolicy == QDomImplementation::ReturnNullNode) { *ok = false; return QString(); } else { result.remove(QLatin1Char('\'')); } } *ok = true; return result;}/************************************************************** * * QDomImplementationPrivate * **************************************************************/QDomImplementationPrivate* QDomImplementationPrivate::clone(){ QDomImplementationPrivate* p = new QDomImplementationPrivate; // We are not interested in this node p->ref.deref(); return p;}/************************************************************** * * QDomImplementation * **************************************************************//*! \class QDomImplementation \reentrant \brief The QDomImplementation class provides information about the features of the DOM implementation. \module XML \ingroup xml-tools This class describes the features that are supported by the DOM implementation. Currently the XML subset of DOM Level 1 and DOM Level 2 Core are supported. Normally you will use the function QDomDocument::implementation() to get the implementation object. You can create a new document type with createDocumentType() and a new document with createDocument(). For further information about the Document Object Model see \l{http://www.w3.org/TR/REC-DOM-Level-1/}{Level 1} and \l{http://www.w3.org/TR/DOM-Level-2-Core/}{Level 2 Core}. For a more general introduction of the DOM implementation see the QDomDocument documentation. \sa hasFeature()*//*! Constructs a QDomImplementation object.*/QDomImplementation::QDomImplementation(){ impl = 0;}/*! Constructs a copy of \a x.*/QDomImplementation::QDomImplementation(const QDomImplementation &x){ impl = x.impl; if (impl) impl->ref.ref();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -