File indexing completed on 2025-09-17 09:09:39
0001
0002
0003
0004 #ifndef QXMLSTREAM_H
0005 #define QXMLSTREAM_H
0006
0007 #include <QtCore/qiodevice.h>
0008
0009 #if QT_CONFIG(xmlstream)
0010
0011 #include <QtCore/qcompare.h>
0012 #include <QtCore/qlist.h>
0013 #include <QtCore/qscopedpointer.h>
0014 #include <QtCore/qstring.h>
0015
0016 #include <memory>
0017
0018 QT_BEGIN_NAMESPACE
0019
0020 namespace QtPrivate {
0021
0022 class QXmlString {
0023 QStringPrivate m_string;
0024 public:
0025 QXmlString(QStringPrivate &&d) : m_string(std::move(d)) {}
0026 QXmlString(const QString &s) : m_string(s.data_ptr()) {}
0027 QXmlString & operator=(const QString &s) { m_string = s.data_ptr(); return *this; }
0028 QXmlString & operator=(QString &&s) { m_string.swap(s.data_ptr()); return *this; }
0029 inline constexpr QXmlString() {}
0030
0031 void swap(QXmlString &other) noexcept
0032 {
0033 m_string.swap(other.m_string);
0034 }
0035
0036 operator QStringView() const noexcept { return QStringView(m_string.data(), m_string.size); }
0037 qsizetype size() const noexcept { return m_string.size; }
0038 bool isNull() const noexcept { return m_string.isNull(); }
0039
0040 private:
0041 friend bool comparesEqual(const QXmlString &lhs, const QXmlString &rhs) noexcept
0042 {
0043 return QStringView(lhs) == QStringView(rhs);
0044 }
0045 Q_DECLARE_EQUALITY_COMPARABLE(QXmlString)
0046 };
0047
0048 }
0049 Q_DECLARE_SHARED_NS_EXT(QtPrivate, QXmlString)
0050
0051
0052 class QXmlStreamReaderPrivate;
0053 class QXmlStreamAttributes;
0054 class Q_CORE_EXPORT QXmlStreamAttribute {
0055 QtPrivate::QXmlString m_name, m_namespaceUri, m_qualifiedName, m_value;
0056 uint m_isDefault : 1;
0057 friend class QXmlStreamReaderPrivate;
0058 friend class QXmlStreamAttributes;
0059 public:
0060 QXmlStreamAttribute();
0061 QXmlStreamAttribute(const QString &qualifiedName, const QString &value);
0062 QXmlStreamAttribute(const QString &namespaceUri, const QString &name, const QString &value);
0063
0064 inline QStringView namespaceUri() const { return m_namespaceUri; }
0065 inline QStringView name() const { return m_name; }
0066 inline QStringView qualifiedName() const { return m_qualifiedName; }
0067 inline QStringView prefix() const {
0068 return QStringView(m_qualifiedName).left(qMax(0, m_qualifiedName.size() - m_name.size() - 1));
0069 }
0070 inline QStringView value() const { return m_value; }
0071 inline bool isDefault() const { return m_isDefault; }
0072 #if QT_CORE_REMOVED_SINCE(6, 8)
0073 inline bool operator==(const QXmlStreamAttribute &other) const
0074 { return comparesEqual(*this, other); }
0075 inline bool operator!=(const QXmlStreamAttribute &other) const
0076 { return !operator==(other); }
0077 #endif
0078
0079 private:
0080 friend bool comparesEqual(const QXmlStreamAttribute &lhs,
0081 const QXmlStreamAttribute &rhs) noexcept
0082 {
0083 if (lhs.m_value != rhs.m_value)
0084 return false;
0085 if (lhs.m_namespaceUri.isNull())
0086 return lhs.m_qualifiedName == rhs.m_qualifiedName;
0087 return lhs.m_namespaceUri == rhs.m_namespaceUri
0088 && lhs.m_name == rhs.m_name;
0089 }
0090 Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamAttribute)
0091 };
0092
0093 Q_DECLARE_TYPEINFO(QXmlStreamAttribute, Q_RELOCATABLE_TYPE);
0094
0095
0096
0097 class QXmlStreamAttributes : public QList<QXmlStreamAttribute>
0098 {
0099 public:
0100 inline QXmlStreamAttributes() {}
0101 #if QT_CORE_REMOVED_SINCE(6, 6)
0102 Q_CORE_EXPORT QStringView value(const QString &namespaceUri, const QString &name) const;
0103 Q_CORE_EXPORT QStringView value(const QString &namespaceUri, QLatin1StringView name) const;
0104 Q_CORE_EXPORT QStringView value(QLatin1StringView namespaceUri, QLatin1StringView name) const;
0105 Q_CORE_EXPORT QStringView value(const QString &qualifiedName) const;
0106 Q_CORE_EXPORT QStringView value(QLatin1StringView qualifiedName) const;
0107 #endif
0108 Q_CORE_EXPORT QStringView value(QAnyStringView namespaceUri, QAnyStringView name) const noexcept;
0109 Q_CORE_EXPORT QStringView value(QAnyStringView qualifiedName) const noexcept;
0110
0111 Q_CORE_EXPORT void append(const QString &namespaceUri, const QString &name, const QString &value);
0112 Q_CORE_EXPORT void append(const QString &qualifiedName, const QString &value);
0113
0114 bool hasAttribute(QAnyStringView qualifiedName) const
0115 {
0116 return !value(qualifiedName).isNull();
0117 }
0118
0119 bool hasAttribute(QAnyStringView namespaceUri, QAnyStringView name) const
0120 {
0121 return !value(namespaceUri, name).isNull();
0122 }
0123
0124 using QList<QXmlStreamAttribute>::append;
0125 };
0126
0127 class Q_CORE_EXPORT QXmlStreamNamespaceDeclaration {
0128 QtPrivate::QXmlString m_prefix, m_namespaceUri;
0129
0130 friend class QXmlStreamReaderPrivate;
0131 public:
0132 QXmlStreamNamespaceDeclaration();
0133 QXmlStreamNamespaceDeclaration(const QString &prefix, const QString &namespaceUri);
0134
0135 inline QStringView prefix() const { return m_prefix; }
0136 inline QStringView namespaceUri() const { return m_namespaceUri; }
0137 #if QT_CORE_REMOVED_SINCE(6, 8)
0138 inline bool operator==(const QXmlStreamNamespaceDeclaration &other) const
0139 { return comparesEqual(*this, other); }
0140 inline bool operator!=(const QXmlStreamNamespaceDeclaration &other) const
0141 { return !operator==(other); }
0142 #endif
0143 private:
0144 friend bool comparesEqual(const QXmlStreamNamespaceDeclaration &lhs,
0145 const QXmlStreamNamespaceDeclaration &rhs) noexcept
0146 {
0147 return lhs.m_prefix == rhs.m_prefix
0148 && lhs.m_namespaceUri == rhs.m_namespaceUri;
0149 }
0150 Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamNamespaceDeclaration)
0151 };
0152
0153 Q_DECLARE_TYPEINFO(QXmlStreamNamespaceDeclaration, Q_RELOCATABLE_TYPE);
0154 typedef QList<QXmlStreamNamespaceDeclaration> QXmlStreamNamespaceDeclarations;
0155
0156 class Q_CORE_EXPORT QXmlStreamNotationDeclaration {
0157 QtPrivate::QXmlString m_name, m_systemId, m_publicId;
0158
0159 friend class QXmlStreamReaderPrivate;
0160 public:
0161 QXmlStreamNotationDeclaration();
0162
0163 inline QStringView name() const { return m_name; }
0164 inline QStringView systemId() const { return m_systemId; }
0165 inline QStringView publicId() const { return m_publicId; }
0166 #if QT_CORE_REMOVED_SINCE(6, 8)
0167 inline bool operator==(const QXmlStreamNotationDeclaration &other) const
0168 { return comparesEqual(*this, other); }
0169 inline bool operator!=(const QXmlStreamNotationDeclaration &other) const
0170 { return !operator==(other); }
0171 #endif
0172 private:
0173 friend bool comparesEqual(const QXmlStreamNotationDeclaration &lhs,
0174 const QXmlStreamNotationDeclaration &rhs) noexcept
0175 {
0176 return lhs.m_name == rhs.m_name && lhs.m_systemId == rhs.m_systemId
0177 && lhs.m_publicId == rhs.m_publicId;
0178 }
0179 Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamNotationDeclaration)
0180 };
0181
0182 Q_DECLARE_TYPEINFO(QXmlStreamNotationDeclaration, Q_RELOCATABLE_TYPE);
0183 typedef QList<QXmlStreamNotationDeclaration> QXmlStreamNotationDeclarations;
0184
0185 class Q_CORE_EXPORT QXmlStreamEntityDeclaration {
0186 QtPrivate::QXmlString m_name, m_notationName, m_systemId, m_publicId, m_value;
0187
0188 friend class QXmlStreamReaderPrivate;
0189 public:
0190 QXmlStreamEntityDeclaration();
0191
0192 inline QStringView name() const { return m_name; }
0193 inline QStringView notationName() const { return m_notationName; }
0194 inline QStringView systemId() const { return m_systemId; }
0195 inline QStringView publicId() const { return m_publicId; }
0196 inline QStringView value() const { return m_value; }
0197 #if QT_CORE_REMOVED_SINCE(6, 8)
0198 inline bool operator==(const QXmlStreamEntityDeclaration &other) const
0199 { return comparesEqual(*this, other); }
0200 inline bool operator!=(const QXmlStreamEntityDeclaration &other) const
0201 { return !operator==(other); }
0202 #endif
0203
0204 private:
0205 friend bool comparesEqual(const QXmlStreamEntityDeclaration &lhs,
0206 const QXmlStreamEntityDeclaration &rhs) noexcept
0207 {
0208 return lhs.m_name == rhs.m_name
0209 && lhs.m_notationName == rhs.m_notationName
0210 && lhs.m_systemId == rhs.m_systemId
0211 && lhs.m_publicId == rhs.m_publicId
0212 && lhs.m_value == rhs.m_value;
0213 }
0214 Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamEntityDeclaration)
0215 };
0216
0217 Q_DECLARE_TYPEINFO(QXmlStreamEntityDeclaration, Q_RELOCATABLE_TYPE);
0218 typedef QList<QXmlStreamEntityDeclaration> QXmlStreamEntityDeclarations;
0219
0220 class Q_CORE_EXPORT QXmlStreamEntityResolver
0221 {
0222 Q_DISABLE_COPY_MOVE(QXmlStreamEntityResolver)
0223 public:
0224 QXmlStreamEntityResolver() = default;
0225 virtual ~QXmlStreamEntityResolver();
0226 virtual QString resolveEntity(const QString& publicId, const QString& systemId);
0227 virtual QString resolveUndeclaredEntity(const QString &name);
0228 };
0229
0230 #if QT_CONFIG(xmlstreamreader)
0231 class Q_CORE_EXPORT QXmlStreamReader
0232 {
0233 QDOC_PROPERTY(bool namespaceProcessing READ namespaceProcessing WRITE setNamespaceProcessing)
0234 public:
0235 enum TokenType {
0236 NoToken = 0,
0237 Invalid,
0238 StartDocument,
0239 EndDocument,
0240 StartElement,
0241 EndElement,
0242 Characters,
0243 Comment,
0244 DTD,
0245 EntityReference,
0246 ProcessingInstruction
0247 };
0248
0249
0250 QXmlStreamReader();
0251 explicit QXmlStreamReader(QIODevice *device);
0252 #if QT_CORE_REMOVED_SINCE(6, 5)
0253 explicit QXmlStreamReader(const QByteArray &data);
0254 explicit QXmlStreamReader(const QString &data);
0255 explicit QXmlStreamReader(const char * data);
0256 #endif
0257 Q_WEAK_OVERLOAD
0258 explicit QXmlStreamReader(const QByteArray &data)
0259 : QXmlStreamReader(data, PrivateConstructorTag{}) { }
0260 explicit QXmlStreamReader(QAnyStringView data);
0261 ~QXmlStreamReader();
0262
0263 void setDevice(QIODevice *device);
0264 QIODevice *device() const;
0265 #if QT_CORE_REMOVED_SINCE(6, 5)
0266 void addData(const QByteArray &data);
0267 void addData(const QString &data);
0268 void addData(const char *data);
0269 #endif
0270 Q_WEAK_OVERLOAD
0271 void addData(const QByteArray &data) { addDataImpl(data); }
0272 void addData(QAnyStringView data);
0273 void clear();
0274
0275
0276 bool atEnd() const;
0277 TokenType readNext();
0278
0279 bool readNextStartElement();
0280 void skipCurrentElement();
0281
0282 TokenType tokenType() const;
0283 QString tokenString() const;
0284
0285 void setNamespaceProcessing(bool);
0286 bool namespaceProcessing() const;
0287
0288 inline bool isStartDocument() const { return tokenType() == StartDocument; }
0289 inline bool isEndDocument() const { return tokenType() == EndDocument; }
0290 inline bool isStartElement() const { return tokenType() == StartElement; }
0291 inline bool isEndElement() const { return tokenType() == EndElement; }
0292 inline bool isCharacters() const { return tokenType() == Characters; }
0293 bool isWhitespace() const;
0294 bool isCDATA() const;
0295 inline bool isComment() const { return tokenType() == Comment; }
0296 inline bool isDTD() const { return tokenType() == DTD; }
0297 inline bool isEntityReference() const { return tokenType() == EntityReference; }
0298 inline bool isProcessingInstruction() const { return tokenType() == ProcessingInstruction; }
0299
0300 bool isStandaloneDocument() const;
0301 bool hasStandaloneDeclaration() const;
0302 QStringView documentVersion() const;
0303 QStringView documentEncoding() const;
0304
0305 qint64 lineNumber() const;
0306 qint64 columnNumber() const;
0307 qint64 characterOffset() const;
0308
0309 QXmlStreamAttributes attributes() const;
0310
0311 enum ReadElementTextBehaviour {
0312 ErrorOnUnexpectedElement,
0313 IncludeChildElements,
0314 SkipChildElements
0315 };
0316 QString readElementText(ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement);
0317
0318 QStringView name() const;
0319 QStringView namespaceUri() const;
0320 QStringView qualifiedName() const;
0321 QStringView prefix() const;
0322
0323 QStringView processingInstructionTarget() const;
0324 QStringView processingInstructionData() const;
0325
0326 QStringView text() const;
0327
0328 QXmlStreamNamespaceDeclarations namespaceDeclarations() const;
0329 void addExtraNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &extraNamespaceDeclaraction);
0330 void addExtraNamespaceDeclarations(const QXmlStreamNamespaceDeclarations &extraNamespaceDeclaractions);
0331 QXmlStreamNotationDeclarations notationDeclarations() const;
0332 QXmlStreamEntityDeclarations entityDeclarations() const;
0333 QStringView dtdName() const;
0334 QStringView dtdPublicId() const;
0335 QStringView dtdSystemId() const;
0336
0337 int entityExpansionLimit() const;
0338 void setEntityExpansionLimit(int limit);
0339
0340 enum Error {
0341 NoError,
0342 UnexpectedElementError,
0343 CustomError,
0344 NotWellFormedError,
0345 PrematureEndOfDocumentError
0346 };
0347 void raiseError(const QString& message = QString());
0348 QString errorString() const;
0349 Error error() const;
0350
0351 inline bool hasError() const
0352 {
0353 return error() != NoError;
0354 }
0355
0356 void setEntityResolver(QXmlStreamEntityResolver *resolver);
0357 QXmlStreamEntityResolver *entityResolver() const;
0358
0359 private:
0360 struct PrivateConstructorTag { };
0361 QXmlStreamReader(const QByteArray &data, PrivateConstructorTag);
0362 void addDataImpl(const QByteArray &data);
0363
0364 Q_DISABLE_COPY(QXmlStreamReader)
0365 Q_DECLARE_PRIVATE(QXmlStreamReader)
0366 std::unique_ptr<QXmlStreamReaderPrivate> d_ptr;
0367
0368 };
0369 #endif
0370
0371 #if QT_CONFIG(xmlstreamwriter)
0372
0373 class QXmlStreamWriterPrivate;
0374
0375 class Q_CORE_EXPORT QXmlStreamWriter
0376 {
0377 QDOC_PROPERTY(bool autoFormatting READ autoFormatting WRITE setAutoFormatting)
0378 QDOC_PROPERTY(int autoFormattingIndent READ autoFormattingIndent WRITE setAutoFormattingIndent)
0379 public:
0380 QXmlStreamWriter();
0381 explicit QXmlStreamWriter(QIODevice *device);
0382 explicit QXmlStreamWriter(QByteArray *array);
0383 explicit QXmlStreamWriter(QString *string);
0384 ~QXmlStreamWriter();
0385
0386 void setDevice(QIODevice *device);
0387 QIODevice *device() const;
0388
0389 void setAutoFormatting(bool);
0390 bool autoFormatting() const;
0391
0392 void setAutoFormattingIndent(int spacesOrTabs);
0393 int autoFormattingIndent() const;
0394
0395 #if QT_CORE_REMOVED_SINCE(6,5)
0396 void writeAttribute(const QString &qualifiedName, const QString &value);
0397 void writeAttribute(const QString &namespaceUri, const QString &name, const QString &value);
0398 #endif
0399 void writeAttribute(QAnyStringView qualifiedName, QAnyStringView value);
0400 void writeAttribute(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView value);
0401
0402 void writeAttribute(const QXmlStreamAttribute& attribute);
0403 void writeAttributes(const QXmlStreamAttributes& attributes);
0404
0405 #if QT_CORE_REMOVED_SINCE(6,5)
0406 void writeCDATA(const QString &text);
0407 void writeCharacters(const QString &text);
0408 void writeComment(const QString &text);
0409
0410 void writeDTD(const QString &dtd);
0411
0412 void writeEmptyElement(const QString &qualifiedName);
0413 void writeEmptyElement(const QString &namespaceUri, const QString &name);
0414
0415 void writeTextElement(const QString &qualifiedName, const QString &text);
0416 void writeTextElement(const QString &namespaceUri, const QString &name, const QString &text);
0417 #endif
0418 void writeCDATA(QAnyStringView text);
0419 void writeCharacters(QAnyStringView text);
0420 void writeComment(QAnyStringView text);
0421
0422 void writeDTD(QAnyStringView dtd);
0423
0424 void writeEmptyElement(QAnyStringView qualifiedName);
0425 void writeEmptyElement(QAnyStringView namespaceUri, QAnyStringView name);
0426
0427 void writeTextElement(QAnyStringView qualifiedName, QAnyStringView text);
0428 void writeTextElement(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView text);
0429
0430
0431 void writeEndDocument();
0432 void writeEndElement();
0433
0434 #if QT_CORE_REMOVED_SINCE(6,5)
0435 void writeEntityReference(const QString &name);
0436 void writeNamespace(const QString &namespaceUri, const QString &prefix);
0437 void writeDefaultNamespace(const QString &namespaceUri);
0438 void writeProcessingInstruction(const QString &target, const QString &data);
0439 #endif
0440 void writeEntityReference(QAnyStringView name);
0441 void writeNamespace(QAnyStringView namespaceUri, QAnyStringView prefix = {});
0442 void writeDefaultNamespace(QAnyStringView namespaceUri);
0443 void writeProcessingInstruction(QAnyStringView target, QAnyStringView data = {});
0444
0445 void writeStartDocument();
0446 #if QT_CORE_REMOVED_SINCE(6,5)
0447 void writeStartDocument(const QString &version);
0448 void writeStartDocument(const QString &version, bool standalone);
0449 void writeStartElement(const QString &qualifiedName);
0450 void writeStartElement(const QString &namespaceUri, const QString &name);
0451 #endif
0452 void writeStartDocument(QAnyStringView version);
0453 void writeStartDocument(QAnyStringView version, bool standalone);
0454 void writeStartElement(QAnyStringView qualifiedName);
0455 void writeStartElement(QAnyStringView namespaceUri, QAnyStringView name);
0456
0457 #if QT_CONFIG(xmlstreamreader)
0458 void writeCurrentToken(const QXmlStreamReader &reader);
0459 #endif
0460
0461 bool hasError() const;
0462
0463 private:
0464 Q_DISABLE_COPY(QXmlStreamWriter)
0465 Q_DECLARE_PRIVATE(QXmlStreamWriter)
0466 std::unique_ptr<QXmlStreamWriterPrivate> d_ptr;
0467 };
0468 #endif
0469
0470 QT_END_NAMESPACE
0471
0472 #endif
0473
0474 #endif