Класс QDomDocument
Класс QDomDocument представляет собой XML-документ. Подробнее...
| Заголовок: | #include <QDomDocument> |
| CMake: | find_package(Qt6 COMPONENTS Xml REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Xml) |
| qmake: | QT += xml |
| Наследует: | QDomNode |
Примечание: Все функции в этом классе являются повторно-входными.
Общедоступные функции
| QDomDocument(const QDomDocument &x) | |
| QDomDocument(const QDomDocumentType &doctype) | |
| QDomDocument(const QString &name) | |
| QDomDocument() | |
| QDomDocument & | operator=(const QDomDocument &x) |
| ~QDomDocument() | |
| QDomAttr | createAttribute(const QString &name) |
| QDomAttr | createAttributeNS(const QString &nsURI, const QString &qName) |
| QDomCDATASection | createCDATASection(const QString &value) |
| QDomComment | createComment(const QString &value) |
| QDomDocumentFragment | createDocumentFragment() |
| QDomElement | createElement(const QString &tagName) |
| QDomElement | createElementNS(const QString &nsURI, const QString &qName) |
| QDomEntityReference | createEntityReference(const QString &name) |
| QDomProcessingInstruction | createProcessingInstruction(const QString &target, const QString &data) |
| QDomText | createTextNode(const QString &value) |
| QDomDocumentType | doctype() const |
| QDomElement | documentElement() const |
| QDomElement | elementById(const QString &elementId) |
| QDomNodeList | elementsByTagName(const QString &tagname) const |
| QDomNodeList | elementsByTagNameNS(const QString &nsURI, const QString &localName) |
| QDomImplementation | implementation() const |
| QDomNode | importNode(const QDomNode &importedNode, bool deep) |
| QDomNode::NodeType | nodeType() const |
| bool | setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr) |
| bool | setContent(const QString &text, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr) |
| bool | setContent(QIODevice *dev, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr) |
| bool | setContent(const QByteArray &buffer, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr) |
| bool | setContent(const QString &text, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr) |
| bool | setContent(QXmlStreamReader *reader, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr) |
| QByteArray | toByteArray(int indent = 1) const |
| QString | toString(int indent = 1) const |
Подробное описание
Класс QDomDocument представляет собой весь XML-документ. По сути, он является корнем дерева документа и предоставляет основной доступ к данным документа.
Поскольку элементы, текстовые узлы, комментарии, инструкции обработки и т. д. не могут существовать вне контекста документа, класс документа также содержит фабричные функции, необходимые для создания этих объектов. Объекты узлов, созданные с помощью этих функций, имеют функцию ownerDocument(), которая связывает их с документом, в контексте которого они были созданы. Классы DOM, которые чаще всего используются, — это QDomNode, QDomDocument, QDomElement и QDomText.
Разбираемый XML представляется внутренне деревом объектов, к которым можно получить доступ с помощью различных классов QDom. Все классы QDom только ссылаются на объекты во внутреннем дереве. Внутренние объекты в дереве DOM будут удалены, когда последний объект QDom, ссылающийся на них, или сам QDomDocument будет удален.
Создание элементов, текстовых узлов и т. д. выполняется с помощью различных фабричных функций, предоставляемых в этом классе. Использование конструкторов по умолчанию классов QDom приведет только к пустым объектам, которые нельзя обрабатывать или вставлять в документ.
Класс QDomDocument имеет несколько функций для создания данных документа, например, createElement(), createTextNode(), createComment(), createCDATASection(), createProcessingInstruction(), createAttribute() и createEntityReference(). Некоторые из этих функций имеют версии, поддерживающие пространства имен, т. е. createElementNS() и createAttributeNS(). Функция createDocumentFragment() используется для хранения частей документа; это полезно для работы с сложными документами.
Весь контент документа устанавливается с помощью setContent(). Эта функция анализирует передаваемую строку как XML-документ и создаёт дерево DOM, представляющее документ. Корневой элемент доступен с помощью documentElement(). Текстовое представление документа можно получить с помощью toString().
Примечание: Дерево DOM может зарезервировать много памяти, если XML-документ большой. Для таких документов классы QXmlStreamReader или QXmlQuery могут быть лучшими решениями.
В документ можно вставить узел из другого документа с помощью importNode().
Вы можете получить список всех элементов, имеющих определённый тег, с помощью elementsByTagName() или elementsByTagNameNS().
Классы QDom обычно используются следующим образом:
QDomDocument doc("mydocument");
QFile file("mydocument.xml");
if (!file.open(QIODevice::ReadOnly))
return;
if (!doc.setContent(&file)) {
file.close();
return;
}
file.close();
// print out the element names of all elements that are direct children
// of the outermost element.
QDomElement docElem = doc.documentElement();
QDomNode n = docElem.firstChild();
while(!n.isNull()) {
QDomElement e = n.toElement(); // try to convert the node to an element.
if(!e.isNull()) {
cout << qPrintable(e.tagName()) << '\n'; // the node really is an element.
}
n = n.nextSibling();
}
// Here we append a new element to the end of the document
QDomElement elem = doc.createElement("img");
elem.setAttribute("src", "myimage.png");
docElem.appendChild(elem); После того, как doc и elem выйдут из области видимости, всё внутреннее дерево, представляющее XML-документ, будет удалено.
Для создания документа, используя DOM, используйте код, подобный этому:
QDomDocument doc;
QDomElement root = doc.createElement("MyML");
doc.appendChild(root);
QDomElement tag = doc.createElement("Greeting");
root.appendChild(tag);
QDomText t = doc.createTextNode("Hello World");
tag.appendChild(t);
QString xml = doc.toString(); Дополнительную информацию о Document Object Model (DOM) см. в спецификациях DOM Level 1 и Level 2 Core.
См. также Пример DOM Закладок и Пример Простого DOM Модели.
Документация функций-членов
QDomDocument::QDomDocument(const QDomDocument &x)
Создаёт копию x.
Данные копии объединены (неглубокая копия): изменение одного узла также изменит другой. Если вы хотите создать глубокую копию, используйте cloneNode().
QDomDocument::QDomDocument(const QDomDocumentType &doctype)
Создаёт документ с типом документа doctype.
См. также QDomImplementation::createDocumentType().
QDomDocument::QDomDocument(const QString &name)
Создаёт документ и задаёт имя типа документа на name.
QDomDocument::QDomDocument()
Создаёт пустой документ.
QDomDocument &QDomDocument::operator=(const QDomDocument &x)
Присваивает x этому документу DOM.
Данные копии объединены (неглубокая копия): изменение одного узла также изменит другой. Если вы хотите создать глубокую копию, используйте cloneNode().
QDomDocument::~QDomDocument()
Уничтожает объект и освобождает его ресурсы.
QDomAttr QDomDocument::createAttribute(const QString &name)
Создаёт новый атрибут с именем name, который можно вставить в элемент, например, используя QDomElement::setAttributeNode().
Если name не является допустимым именем XML, поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также createAttributeNS().
QDomAttr QDomDocument::createAttributeNS(const QString &nsURI, const QString &qName)
Создаёт новый атрибут с поддержкой пространства имён, который можно вставить в элемент. Имя атрибута — qName, а URI пространства имён — nsURI. Эта функция также устанавливает QDomNode::prefix() и QDomNode::localName() на соответствующие значения (в зависимости от qName).
Если qName не является допустимым именем XML, поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также createAttribute().
QDomCDATASection QDomDocument::createCDATASection(const QString &value)
Создаёт новый раздел CDATA для строки value, который можно вставить в документ, например, с помощью QDomNode::appendChild().
Если value содержит символы, которые не могут быть сохранены в разделе CDATA, поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также QDomNode::appendChild(), QDomNode::insertBefore() и QDomNode::insertAfter().
QDomComment QDomDocument::createComment(const QString &value)
Создаёт новый комментарий для строки value, который можно вставить в документ, например, с помощью QDomNode::appendChild().
Если value содержит символы, которые не могут быть сохранены в XML-комментарии, поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также QDomNode::appendChild(), QDomNode::insertBefore() и QDomNode::insertAfter().
QDomDocumentFragment QDomDocument::createDocumentFragment()
Создаёт новый фрагмент документа, который может использоваться для хранения частей документа, например, при выполнении сложных манипуляций с деревом документа.
QDomElement QDomDocument::createElement(const QString &tagName)
Создаёт новый элемент с именем tagName, который можно вставить в дерево DOM, например, с помощью QDomNode::appendChild().
Если tagName не является допустимым именем XML, поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также createElementNS(), QDomNode::appendChild(), QDomNode::insertBefore() и QDomNode::insertAfter().
QDomElement QDomDocument::createElementNS(const QString &nsURI, const QString &qName)
Создаёт новый элемент с поддержкой пространства имён, который можно вставить в дерево DOM. Имя элемента — qName, а URI пространства имён — nsURI. Эта функция также устанавливает QDomNode::prefix() и QDomNode::localName() на соответствующие значения (в зависимости от qName).
Если qName пустая строка, возвращает нулевой элемент, независимо от того, установлен ли параметр политики некорректных данных.
См. также createElement().
QDomEntityReference QDomDocument::createEntityReference(const QString &name)
Создаёт новую ссылку на сущность с именем name, которую можно вставить в документ, например, с помощью QDomNode::appendChild().
Если name не является допустимым именем XML, поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также QDomNode::appendChild(), QDomNode::insertBefore() и QDomNode::insertAfter().
QDomProcessingInstruction QDomDocument::createProcessingInstruction(const QString &target, const QString &data)
Создаёт новую инструкцию обработки, которую можно вставить в документ, например, с помощью QDomNode::appendChild(). Эта функция устанавливает целевой параметр для инструкции обработки на target, а данные — на data.
Если target не является допустимым именем XML или data содержит символы, которые не могут появиться в инструкции обработки, поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также QDomNode::appendChild(), QDomNode::insertBefore() и QDomNode::insertAfter().
QDomText QDomDocument::createTextNode(const QString &value)
Создаёт узел текста для строки value, который можно вставить в дерево документа, например, с помощью QDomNode::appendChild().
Если value содержит символы, которые не могут храниться в виде символьных данных XML-документа (даже в виде символьных ссылок), поведение этой функции определяется QDomImplementation::InvalidDataPolicy.
См. также QDomNode::appendChild(), QDomNode::insertBefore() и QDomNode::insertAfter().
QDomDocumentType QDomDocument::doctype() const
Возвращает тип документа этого документа.
QDomElement QDomDocument::documentElement() const
Возвращает корневой элемент документа.
QDomElement QDomDocument::elementById(const QString &elementId)
Возвращает элемент, идентификатор которого равен elementId. Если элемент с таким идентификатором не найден, эта функция возвращает нулевой элемент.
END_OF_DOCUMENT_MARKERПоскольку QDomClasses не знают, какие атрибуты являются идентификаторами элементов, эта функция всегда возвращает нулевой элемент. Это может измениться в будущей версии.
QDomNodeList QDomDocument::elementsByTagName(const QString &tagname) const
Возвращает QDomNodeList, содержащий все элементы в документе с именем tagname. Порядок списка узлов соответствует порядку их обнаружения в обходе дерева элементов в порядке прямой обхода.
См. также elementsByTagNameNS() и QDomElement::elementsByTagName().
QDomNodeList QDomDocument::elementsByTagNameNS(const QString &nsURI, const QString &localName)
Возвращает QDomNodeList, содержащий все элементы в документе с локальным именем localName и URI пространства имён nsURI. Порядок списка узлов соответствует порядку их обнаружения в обходе дерева элементов в порядке прямой обхода.
См. также elementsByTagName() и QDomElement::elementsByTagNameNS().
QDomImplementation QDomDocument::implementation() const
Возвращает объект QDomImplementation.
QDomNode QDomDocument::importNode(const QDomNode &importedNode, bool deep)
Импортирует узел importedNode из другого документа в этот документ. importedNode остаётся в исходном документе; эта функция создаёт копию, которую можно использовать в этом документе.
Функция возвращает импортированный узел, принадлежащий этому документу. Возвращаемый узел не имеет родителя. Невозможно импортировать узлы QDomDocument и QDomDocumentType. В этих случаях функция возвращает нулевой узел.
Если importedNode является нулевым узлом, возвращается нулевой узел.
Если deep равно true, эта функция импортирует не только узел importedNode, но и всё его поддерево; если false, импортируется только importedNode. Аргумент deep не влияет на узлы QDomAttr и QDomEntityReference, поскольку потомки узлов QDomAttr всегда импортируются, а потомки узлов QDomEntityReference никогда не импортируются.
Поведение этой функции немного отличается в зависимости от типа узла:
| Тип узла | Поведение |
|---|---|
| QDomAttr | Владеющий элемент устанавливается в 0, и указанный флаг устанавливается в true в сгенерированном атрибуте. Всё поддерево importedNode всегда импортируется для атрибутов: deep не имеет эффекта. |
| QDomDocument | Узлы документа импортировать нельзя. |
| QDomDocumentFragment | Если deep равно true, функция импортирует весь фрагмент документа; в противном случае она генерирует только пустой фрагмент документа. |
| QDomDocumentType | Узлы типа документа импортировать нельзя. |
| QDomElement | Атрибуты, для которых QDomAttr::specified() равно true, также импортируются; другие атрибуты не импортируются. Если deep равно true, функция также импортирует поддерево importedNode; в противном случае импортируется только узел элемента (и некоторые атрибуты, см. выше). |
| QDomEntity | Узлы сущности могут быть импортированы, но в настоящее время нет способа их использовать, так как тип документа в DOM уровня 2 является только для чтения. |
| QDomEntityReference | Потомки узлов ссылки на сущность никогда не импортируются: deep не имеет эффекта. |
| QDomNotation | Узлы обозначений могут быть импортированы, но в настоящее время нет способа их использовать, так как тип документа в DOM уровня 2 является только для чтения. |
| QDomProcessingInstruction | Целевое значение и значение инструкции обработки копируются в новый узел. |
| QDomText | Текст копируется в новый узел. |
| QDomCDATASection | Текст копируется в новый узел. |
| QDomComment | Текст копируется в новый узел. |
См. также QDomElement::setAttribute(), QDomNode::insertBefore(), QDomNode::insertAfter(), QDomNode::replaceChild(), QDomNode::removeChild(), и QDomNode::appendChild().
QDomNode::NodeType QDomDocument::nodeType() const
Возвращает DocumentNode.
bool QDomDocument::setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)
Эта функция парсит XML-документ из массива байтов data и устанавливает его как содержимое документа. Она пытается определить кодировку документа в соответствии со спецификацией XML.
Если namespaceProcessing равно true, парсер распознаёт пространства имён в XML-файле и устанавливает имя префикса, локальное имя и URI пространства имён в соответствующие значения. Если namespaceProcessing равно false, парсер не обрабатывает пространства имён при чтении XML-файла.
Если возникает ошибка разбора, эта функция возвращает false и сообщение об ошибке помещается в *errorMsg, номер строки в *errorLine, а номер столбца в *errorColumn (если соответствующий указатель не равен 0); в противном случае эта функция возвращает true. Различные сообщения об ошибках описаны в документации класса QXmlParseException. Обратите внимание, что, если вы хотите отобразить эти сообщения об ошибках пользователям вашего приложения, они будут отображаться на английском языке, если не будут явно переведены.
Если namespaceProcessing равно true, функция QDomNode::prefix() возвращает строку для всех элементов и атрибутов. Она возвращает пустую строку, если у элемента или атрибута нет префикса.
Узлы текста, состоящие только из пробелов, удаляются и не отображаются в QDomDocument. Если это поведение нежелательно, можно использовать перегрузку setContent(), которая позволяет предоставить QXmlReader.
Если namespaceProcessing равно false, функции QDomNode::prefix(), QDomNode::localName() и QDomNode::namespaceURI() возвращают пустую строку.
Обработка ссылок на сущности выполняется следующим образом:
- Ссылки на внутренние общие сущности и символьные сущности, встречающиеся в содержимом, включаются. Результатом является узел QDomText с ссылками, заменёнными соответствующими значениями сущностей.
- Ссылки на параметры сущностей, встречающиеся во внутренней подгруппе, включаются. Результатом является узел QDomDocumentType, который содержит объявления сущностей и обозначений со ссылками, заменёнными соответствующими значениями сущностей.
- Любая общая ссылка на распаршенную сущность, которая не определена во внутренней подгруппе и встречается в содержимом, представляется как узел QDomEntityReference.
- Любая ссылка на распаршенную сущность, которая не определена во внутренней подгруппе и встречается вне содержимого, заменяется пустой строкой.
- Любая нераспаршенная ссылка на сущность заменяется пустой строкой.
См. также QDomNode::namespaceURI(), QDomNode::localName(), QDomNode::prefix(), QString::isNull() и QString::isEmpty().
bool QDomDocument::setContent(const QString &text, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)
Это перегруженная функция.
Эта функция считывает XML-документ из строки text, возвращая true, если содержимое было успешно распарсено; в противном случае возвращает false. Поскольку text уже представляет собой строку Юникода, обнаружение кодировки не выполняется.
bool QDomDocument::setContent(QIODevice *dev, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)
Это перегруженная функция.
Эта функция считывает XML-документ из устройства ввода/вывода dev, возвращая true, если содержимое было успешно распарсено; в противном случае возвращает false.
Примечание: Этот метод будет пытаться открыть dev в режиме только для чтения, если он не открыт. В этом случае вызывающий метод отвечает за вызов close. Это изменится в Qt 7, который больше не будет открывать dev. Поэтому приложения должны открывать устройство сами, прежде чем вызывать setContent.
bool QDomDocument::setContent(const QByteArray &buffer, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)
Это перегруженный метод.
Этот метод считывает XML-документ из массива байтов buffer, возвращая true, если содержимое было успешно проанализировано; в противном случае возвращает false.
Обработка имён пространств имён не выполняется.
bool QDomDocument::setContent(const QString &text, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)
Это перегруженный метод.
Этот метод считывает XML-документ из строки text, возвращая true, если содержимое было успешно проанализировано; в противном случае возвращает false. Поскольку text уже является строкой Юникод, детектирование кодировки не выполняется.
Обработка имён пространств имён также не выполняется.
[since 5.15] bool QDomDocument::setContent(QXmlStreamReader *reader, bool namespaceProcessing, QString *errorMsg = nullptr, int *errorLine = nullptr, int *errorColumn = nullptr)
Это перегруженный метод.
Этот метод считывает XML-документ из QXmlStreamReader reader и анализирует его. Возвращает true если содержимое было успешно проанализировано; в противном случае возвращает false.
Если namespaceProcessing true, анализатор распознает имена пространств в XML-файле и устанавливает имя префикса, локальное имя и URI пространства имён в соответствующие значения. Если namespaceProcessing false, анализатор не выполняет обработку имён пространств при чтении XML-файла.
Если произошла ошибка разбора, сообщение об ошибке помещается в *errorMsg, номер строки в *errorLine, а номер столбца в *errorColumn (если соответствующий указатель не установлен в 0).
Этот метод был добавлен в Qt 5.15.
См. также QXmlStreamReader.
QByteArray QDomDocument::toByteArray(int indent = 1) const
Преобразует проанализированный документ обратно в текстовое представление и возвращает QByteArray, содержащий данные, закодированные в UTF-8.
Этот метод использует indent в качестве отступа для вложенных элементов.
См. также toString().
QString QDomDocument::toString(int indent = 1) const
Преобразует проанализированный документ обратно в его текстовое представление.
Этот метод использует indent в качестве отступа для вложенных элементов.
Если indent равно -1, отступы не добавляются.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qdomdocument.html