| |
Существует два основных подхода создания XML-файлов в приложениях Qt:
Можно построить дерево DOM и затем вызвать метод save().
Можно вручную создать XML-файл
const int Indent = 4; QDomDocument doc; QDomElement root = doc.createElement("doc"); QDomElement quote = doc.createElement("quote"); QDomElement translation = doc.createElement("translation"); QDomText quoteText = doc.createTextNode("Errare humanum est"); QDomText translationText = doc.createTextNode("To err is human"); doc.appendChild(root); root.appendChild(quote); root.appendChild(translation); quote.appendChild(quoteText); translation.appendChild(translationText); QTextStream out(&file); doc.save(out, Indent);Вторым аргументом функции save() передается размер отступов. Ненулевое значение обеспечивает более удобочитаемый вид файла:
<doc> <quote>Errare humanum est</quote> <translation>To err is human</translation> </doc>Другой вариант применим в приложениях, которые используют структуру DOM-дерева для внутренней организации данных. Такие приложения, как правило, читают XML-документы с помощью DOM-парсера в память, затем изменяют содержимое дерева и сохраняют изменения с помощью save() в XML-файл.
В примерах выше использовалась кодировка UTF-8, однако существует возможность сохранения данных в других кодировках. Для этого достаточно добавить в начало XML-файла соответствующую кодировку:
<?xml version="1.0" encoding="ISO-8859-1"?>Следующий отрывок кода показывает, как это можно сделать:
QTextStream out(&file); QDomNode xmlNode = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"ISO-8859-1\""); doc.insertBefore(xmlNode, doc.firstChild()); doc.save(out, Indent);Создание XML-файлов вручную выполняется ничуть не сложнее. Для этого можно воспользоваться классом QTextStream и записать в него строки, как в обычный текстовый файл. Самое сложное в этом случае -- выполнить правильное экранирование служебных символов и значений атрибутов. Сделать это можно с помощью отдельной функции:
QString escapeXml(const QString &str) { QString xml = str; xml.replace("&", "&"); xml.replace("<", "<"); xml.replace(">", ">"); xml.replace(" ", "'"); xml.replace("\"", """); return xml; }Ниже приводится пример использования этой функции:
QTextStream out(&file); out.setEncoding(QTextStream::UnicodeUTF8); out << "<doc>\n" << " <quote>" << escapeXml(quoteText) << "</quote>\n" << " <translation>" << escapeXml(translationText) << "</translation>\n" << "</doc>\n";В ежеквартальнике Qt Quarterly вы найдете статью "Generating XML" (по адресу: http://doc.trolltech.com/qq/qq05-generating-xml.html, в которой приводится пример простого класса, создающего XML-файлы. Класс сам обслуживает экранирование служебных символов, вставляет отступы и задает кодировку символов, предоставляя нам возможность сконцентрироваться на содержимом XML-файла.
Пред. | В начало | След. |
Чтение XML-документов с помощью DOM. | На уровень выше | Интернационализация |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |