SlideShare une entreprise Scribd logo
1  sur  47
Télécharger pour lire hors ligne
Темы лекции: Работа с XML.
Практическое задание: Работа с XML.
Тренер: Игорь Шкулипа, к.т.н.
С++ Библиотеки STL и Qt. Занятие 6
http://www.slideshare.net/IgorShkulipa 2
Файловый ввод-вывод
Qt предоставляет свою собственную поддержку операций для работы с
файлами, состоящую из следующих классов:
• QDir — для работы с директориями;
• QFile — для работы с файлами;
• QFileInfо — для получения файловой информации;
• QIODevice — абстрактный класс для ввода/вывода;
• QBuffer — для буферизации файлов в памяти компьютера.
http://www.slideshare.net/IgorShkulipa 3
QIODevice
QIODevice — это абстрактный класс, обобщающий устройство
ввода/вывода, который содержит виртуальные методы для открытия и
закрытия устройства ввода/вывода, а также для чтения и записи
блоков данных или отдельных символов.
Реализация конкретного устройства происходит в унаследованных
классах.
В Qt есть четыре класса, наследующие класс QIODevice:
• QFile — класс для проведения операций с файлами;
• QBuffer — позволяет записывать и считывать данные в массив
QByteArray, как будто бы это устройство или файл;
• QAbstractSocket — базовый класс для сетевой коммуникации
посредством сокетов.
• QProcess — этот класс предоставляет возможность запуска
процессов с дополнительными аргументами и позволяет
обмениваться информацией с этими процессами посредством
методов, определенных в QIODevice.
http://www.slideshare.net/IgorShkulipa 4
Открытие QIODevice
Для работы с устройством его необходимо открыть в одном из режимов,
определенных В заголовочном файле класса QIODevice.
Для того чтобы в любой момент времени исполнения программы узнать, в
каком из режимов было открыто устройство, нужно вызвать метод
openMode().
• QIODevice::NotOpen — устройство не открыто (это значение не имеет
смысла передавать в метод open());
• QIODevice::ReadOnly — открытие устройства только для чтения данных;
• QIODevice::writeOnly — открытие устройства только для записи данных;
• QIODevice::ReadWrite — открытие устройства для чтения и записи данных
(то же, что и IO_ReadOnly | IO_WriteOnly);
• QIODevice::Append — открытие устройства для добавления данных;
• QIODevice::Unbuffered — открытие для непосредственного доступа к
данным, в обход промежуточных буферов чтения и записи;
• QIODevice::Text — применяются преобразования символов переноса
строки в зависимости от платформы. Для ОС Windows, например — rn, а
для MacOS X и UNIX — /r;
• QIODevice::Truncate — все данные устройства, по возможности, должны
быть удалены при открытии.
http://www.slideshare.net/IgorShkulipa 5
Чтение-запись
Считывать и записывать данные можно с помощью методов read() и
write() соответственно. Для чтения всех данных сразу определен
метод readAll(), который возвращает их в объекте типа QByteArray.
Строку или символ можно прочитать методами readLine() и getChar()
соответственно.
В классе QIODevice определен метод для смены текущего положения
seek(). Получить текущее положение можно вызовом метода pos(). Но
не забывайте, что эти методы применимы только для прямого доступа
к данным. При последовательном доступе, каким является сетевое
соединение, они теряют смысл. Более того, в этом случае теряет смысл
и метод size(), возвращающий размер данных устройства. Все эти
операции применимы только для QFile, QBuffer и QTemporaryFile.
Для создания собственного класса устройства ввода/вывода, для которого
Qt не предоставляет поддержки, необходимо унаследовать класс
QIODevice и реализовать в нем методы readData() и writeData(). В
большинстве случаев может потребоваться перезаписать методы
open(), close() и atEnd().
http://www.slideshare.net/IgorShkulipa 6
XML
XML (eXtensible Markup Language, или расширяемый язык разметки) — это
язык описания документов, во многом похожий на язык разметки
гипертекста HTML, но гораздо более универсальный, чем HTML.
XML — текстовый формат, предназначенный для хранения
структурированных данных (взамен существующих файлов баз
данных), для обмена информацией между программами, а также для
создания на его основе более специализированных языков разметки
(например, XHTML), иногда называемых словарями.
Пример:
<?xml version="1.0"?>
<list_of_items>
<item id="1">
<first/>Первый</item>
<item id="2">Второй
<sub_item>подпункт 1</sub_item>
</item>
<last/>Последний</item>
</list_of_items>
http://www.slideshare.net/IgorShkulipa 7
Формат XML-файла
Первая строка XML документа называется объявлением XML (declaration) это
необязательная строка, указывающая версию стандарта XML. Здесь может быть
указана кодировка символов и внешние зависимости.:
<?xml version="1.0" encoding=“windows-1251"?>
Далее идут элементы документа, разделенные открывающими и закрывающими
тэгами. Каждый элемент имеет имя, которым начинается открывающий тэг
элемента и заканчивается закрывающий.
Содержимым элемента (content), называется всё, что расположено между
открывающим и закрывающим тегами. Все значения атрибутов должны быть в
одинарных или двойных кавычках. Каждый XML документ обязательно содержит
один корневой элемент (report) и сколько угодно вложенных элементов (place,
measurement). Любой вложенный элемент также может иметь свои вложенные
элементы.
Комментарии вводятся конструкцией:
<!-- Текст комментария -->
Текстовые данные в XML называются сущностью (entity). Текст может содержать
спецсимволы (некоторые символы запрещены) ссылки на сущность (entity
references). Кодировка спецсимволов в XML аналогична HTML:
&amp; &
&lt <
&gt; >
&apos; '
&quot; "
&nbsp; пробел.
http://www.slideshare.net/IgorShkulipa 8
В 1980-е годы был разработан - SGML (Standard Generalized Markup
Language)
◦ разработан для МО США; задача - снизить расходы на передачу
документации
◦ четкая иерархическая структурированность информации;
◦ расширяемость стандарта
◦ отделение информации от представления (использование DTD -
Document Type Definition)
◦ слишком сложен для реализации в Web (Sounds Good, Maybe Later)
Предыстория XML: SGML
http://www.slideshare.net/IgorShkulipa 9
• Документ называется действительным, если он имеет связанное с
ним определение типа документа (схему) и соответствует ему
• В XML 1.0 единственным типом схем является DTD – Document Type
Definition
• DTD основано на упрощенном формате SGML и было создано для
нужд EDI (Electronic Data Interchange)
• Синтаксис DTD существенно отличается от XML
Определение типа документа (DTD)
<!ELEMENT Joke (Setup, Punchline) >
<!ATTLIST Joke author CDATA #REQUIRED
firstTold CDATA #IMPLIED >
<!ELEMENT Setup (#PCDATA) >
<!ELEMENT Punchline (#PCDATA) >
<?xml version="1.0"?>
<!DOCTYPE Joke SYSTEM "Joke.dtd">
<Joke author="Groucho Marx">
<Setup>Outside of a dog, a book is man's
best friend</Setup>
<Punchline>Inside of a dog, it's too dark
to read.</Punchline>
</Joke>
http://www.slideshare.net/IgorShkulipa 10
Проблемы DTD
● DTD - строго иерархический формат, плохо подходящий для
меняющихся документов
● У документа может быть только один тип, что не очень удобно для
коммерческих приложений
● Синтаксис DTD не похож на XML и плохо воспринимается человеком
● В DTD допустимо использование только текстового типа данных (нет
числового типа или даты)
http://www.slideshare.net/IgorShkulipa 11
XML-схемы
● Схемы должны следовать синтаксису XML
● Стандарт схемы должен поддерживать распространенные типы данных
(число, дата…)
● Схема XML должна быть открытой для подключения внешних источников
● Метод разрешения неоднозначности имен при соединении двух файлов -
пространства имен.
http://www.slideshare.net/IgorShkulipa 12
XML Schema
XML Schema – промышленный стандарт описания XML-документов
XML Schema делает следующее:
• Описывает названия элементов и атрибутов (словарь).
• Описывает взаимосвязь между элементами и атрибутами, а также
их структуру (модель содержания).
• Описывает типы данных.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="книга" type="Книга" />
<xs:complexType name="Книга">
<xs:sequence>
<xs:element name="название" type="xs:string" />
<xs:element name="цена" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:schema>
http://www.slideshare.net/IgorShkulipa 13
Document Object Model
• Объектная модель документа открывает доступ к XML-документу как к
древовидной структуре в памяти
• Позволяет работать с XML-документом как с обычным объектом в
любом современном языке программирования
• Перед началом работы DOM требует загрузки всего документа в
память (поэтому разрабатываются и альтернативные стандарты)
• Стандарт оставляет разработчикам большую свободу в интерпретации
• Microsoft предлагает MS XML DOM 3.0, интегрированную в продукты
Microsoft
XPath
XPath (XML Path Language) — язык запросов к элементам XML-документа.
Разработан для организации доступа к частям документа XML в файлах
трансформации XSLT и является стандартом консорциума W3C. XPath
призван реализовать навигацию по DOM в XML
http://www.slideshare.net/IgorShkulipa 14
XSLT
XSLT (eXtensible Stylesheet Language Transformations) — язык
преобразования XML-документов. Спецификация XSLT входит в состав
XSL и является рекомендацией W3C.
При применении таблицы стилей XSLT, состоящей из набора шаблонов, к
XML-документу (исходное дерево) образуется конечное дерево, которое
может быть сериализовано в виде XML-документа, XHTML-документа,
HTML-документа или простого текстового файла.
XSLT имеет множество различных применений, в основном в области web-
программирования и генерации отчётов. Одной из задач, решаемых
языком XSLT, является отделение данных от их представления, как часть
общей парадигмы MVC.
XQuery
XQuery — язык запросов, разработанный для обработки данных в
формате XML. XQuery использует XML как свою модель данных.
http://www.slideshare.net/IgorShkulipa 15
Достоинства XML
• XML — язык разметки, позволяющий отобразить двоичные данные в текст,
читаемый человеком и анализируемый компьютером;
• XML поддерживает Юникод;
• в формате XML могут быть описаны такие структуры данных как записи, списки и
деревья;
• XML — это самодокументируемый формат, который описывает структуру и имена
полей так же как и значения полей;
• XML имеет строго определённый синтаксис и требования к анализу, что
позволяет ему оставаться простым, эффективным и непротиворечивым.
Одновременно с этим, разные разработчики не ограничены в выборе
экспрессивных методов (например, можно моделировать данные, помещая
значения в параметры тегов или в тело тегов, можно использовать различные
языки и нотации для именования тегов и т. д.);
• XML — формат, основанный на международных стандартах;
• Иерархическая структура XML подходит для описания практически любых типов
документов, кроме аудио и видео мультимедийных потоков, растровых
изображений, сетевых структур данных и двоичных данных;
• XML представляет собой простой текст, свободный от лицензирования и каких-
либо ограничений;
• XML не зависит от платформы;
http://www.slideshare.net/IgorShkulipa 16
Достоинства XML
• XML является подмножеством SGML (который используется с 1986 года). Уже
накоплен большой опыт работы с языком и созданы специализированные
приложения;
• XML не накладывает требований на расположение символов в строке;
• В отличие от бинарных форматов, XML содержит метаданные об именах, типах и
классах описываемых объектов, по которым приложение может обработать
документ неизвестной структуры (например, для динамического построения
интерфейсов);
• XML имеет реализации парсеров для всех современных языков
программирования;
• XML поддерживается на низком аппаратном, микропрограммном и программном
уровнях в современных аппаратных решениях.
http://www.slideshare.net/IgorShkulipa 17
Недостатки XML
• Синтаксис XML избыточен.
• Размер XML-документа существенно больше бинарного представления тех же
данных. В грубых оценках величину этого фактора принимают за 1 порядок (в
10 раз).
• Размер XML-документа существенно больше, чем документа в альтернативных
текстовых форматах передачи данных (например JSON, YAML) и особенно в
форматах данных, оптимизированных для конкретного случая использования.
• Избыточность XML может повлиять на эффективность приложения. Возрастает
стоимость хранения, обработки и передачи данных.
• XML содержит метаданные (об именах полей, классов, вложенности структур), и
одновременно XML позиционируется как язык взаимодействия открытых систем.
При передаче между системами большого количества объектов одного типа
(одной структуры), передавать метаданные повторно нет смысла, хотя они
содержатся в каждом экземпляре XML описания.
• Для большого количества задач не нужна вся мощь синтаксиса XML и можно
использовать значительно более простые и производительные решения.
• Неоднозначность моделирования.
• Нет общепринятой методологии для моделирования данных в XML, в то время
как для реляционной модели и объектно-ориентированной такие средства
разработаны и базируются на реляционной алгебре, системном подходе и
системном анализе.
http://www.slideshare.net/IgorShkulipa 18
Недостатки XML
• В природе есть множество объектов и явлений, для описания которых разные структуры
данных (сетевая, реляционная, иерархическая) являются естественными, и отображение
объекта в неестественную для него модель является болезненным для его сути. В случае с
реляционной и иерархической моделями определены процедуры декомпозиции,
обеспечивающие относительную однозначность, чего нельзя сказать о сетевой модели.
• В результате большой гибкости языка и отсутствия строгих ограничений, одна и та же
структура может быть представлена множеством способов (различными разработчиками),
например, значение может быть записано как атрибут тега или как тело тега и т. д. Например:
<a b="1" c="1"/> или <a b="1" c="1"></a> или <a><b>1</b><c>1</c></a> или <a><c
value="1"/></a> или <a><fields b="1" c="1"/></a> и т. д.
• Поддержка многих языков в именовании тегов дает возможность назвать, например вес
русским словом, в таком случае компьютер никак не сможет установить соответствия этого
поля с полем weight в англоязычной версии программы и с полями в версиях модели объекта
на множестве других языков.
• XML не содержит встроенной в язык поддержки типов данных. В нём нет строгой типизации, то
есть понятий «целых чисел», «строк», «дат», «булевых значений» и т. д.
• Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной
моделью и объектно-ориентированными графами и сетевой моделью данных.
• Выражение неиерархических данных (например графов) требует дополнительных усилий.
• Кристофер Дейт, специалист в области реляционных баз данных, автор классического
учебника «An Introduction to Database Systems», отмечал, что «…XML является попыткой
заново изобрести иерархические базы данных…» (в 1980-е года иерархические базы данных
были вытеснены реляционными базами данных).
• Пространства имён XML сложно использовать и их сложно реализовывать в XML-парсерах.
• Существуют другие, обладающие сходными с XML возможностями, текстовые форматы данных,
которые обладают более высоким удобством чтения человеком (YAML, JSON, SweetXML, XF).
http://www.slideshare.net/IgorShkulipa 19
XML в Qt
Qt обеспечивает два программных интерфейса для чтения XML – SAX и
DOM, эти интерфейсы входят в состав QtXml.
• SAX – Simple API for XML. Позволяет обрабатывать события
синтаксического анализа непосредственно в приложении в
соответствующих виртуальных методах.
• DOM – Document Object Model. Преобразует документ XML в
древовидную структуру, которая затем может обрабатываться в
приложении.
http://www.slideshare.net/IgorShkulipa 20
Чтение XML при помощи SAX
Qt обеспечивает построенный на основе интерфейса SAX парсер
документов XML, не предусматривающий проверку их достоверности
под названием QXmlSimpleReader.
Этот парсер распознает хорошо сформированные документы XML и
поддерживает пространства имен XML. Когда парсер обрабатывает
документ, он вызывает виртуальные функции в зарегистрированных
классах—обработчиках, уведомляющих о возникновении
соответствующих событий в ходе синтаксического анализа документа.
При чтении документа, парсер вызовет следующие обработчики событий
синтаксического анализа:
• startDocument()
• startElement()
• characters()
• endElement()
• endDocument()
Все приведенные выше функции объявлены в абстрактном классе
QXmlContentHandler и должны быть реализованы в конкретном
обработчике.
http://www.slideshare.net/IgorShkulipa 21
Пример. XML
<?xml version="1.0"?>
<books>
<book id="11111">
<name>Song of Ice and Fire</name>
<author>George R.R. Martin</author>
<pages>100500</pages>
<year>2011</year>
<language>English</language>
</book>
<book id="22222">
<name>War and Peace</name>
<author>Lev Tolstoy</author>
<pages>200500</pages>
<year>1869</year>
<language>Russian</language>
</book>
</books>
http://www.slideshare.net/IgorShkulipa 22
Пример. Класс-обработчик
class XmlBookHandler : public QXmlDefaultHandler
{
public:
XmlBookHandler(QTreeWidget* treeWidget);
bool startElement(const QString &namespaceURI,
const QString &localName, const QString &qName,
const QXmlAttributes &atts);
bool endElement(const QString &namespaceURI,
const QString &localName, const QString &qName);
bool characters(const QString &ch);
bool fatalError(const QXmlParseException &exception);
~XmlBookHandler();
private:
QTreeWidget* treeWidget;
QTreeWidgetItem* currentItem;
QTreeWidgetItem* parentItem;
QString currentText;
private:
static const QString TAG_BOOKS;
static const QString TAG_BOOK;
static const QString TAG_NAME;
static const QString TAG_AUTHOR;
static const QString TAG_PAGES;
static const QString TAG_YEAR;
static const QString TAG_LANGUAGE;
static const QString ATTR_ID;
};
http://www.slideshare.net/IgorShkulipa 23
Пример. Реализация обработчика
const QString XmlBookHandler::TAG_BOOKS=QString("books");
const QString XmlBookHandler::TAG_BOOK=QString("book");
const QString XmlBookHandler::TAG_NAME=QString("name");
const QString XmlBookHandler::TAG_AUTHOR=QString("author");
const QString XmlBookHandler::TAG_PAGES=QString("pages");
const QString XmlBookHandler::TAG_YEAR=QString("year");
const QString XmlBookHandler::TAG_LANGUAGE=QString("language");
const QString XmlBookHandler::ATTR_ID=QString("id");
XmlBookHandler::XmlBookHandler(QTreeWidget* treeWidget)
{
this->treeWidget=treeWidget;
this->currentItem=0;
this->parentItem=0;
}
XmlBookHandler::~XmlBookHandler()
{
}
http://www.slideshare.net/IgorShkulipa 24
Пример. Реализация обработчика. startElement()
bool XmlBookHandler::startElement(const QString &namespaceURI,
const QString &localName, const QString &qName,
const QXmlAttributes &atts)
{
if (qName==TAG_BOOK)
{
if (!currentItem)
{
currentItem=new QTreeWidgetItem(treeWidget);
parentItem=currentItem;
}else
{
currentItem=new QTreeWidgetItem(currentItem);
}
currentItem->setText(
0, TAG_BOOK+" "+atts.value(ATTR_ID));
}
return true;
}
http://www.slideshare.net/IgorShkulipa 25
Пример. Реализация обработчика. endElement()
bool XmlBookHandler::endElement(const QString &namespaceURI,
const QString &localName, const QString &qName)
{
if (qName==TAG_BOOK) {
currentItem=0;
}else
{
if ((qName==TAG_NAME)||
(qName==TAG_AUTHOR)||
(qName==TAG_PAGES)||
(qName==TAG_YEAR)||
(qName==TAG_LANGUAGE))
{
currentItem=new QTreeWidgetItem(currentItem);
currentItem->setText(0, currentText);
}
currentItem=parentItem;
}
return true;
}
http://www.slideshare.net/IgorShkulipa 26
Пример. Реализация обработчика. characters() и
fatalError()
bool XmlBookHandler::characters(const QString &ch)
{
currentText=QString(ch);
return true;
}
bool XmlBookHandler::fatalError(
const QXmlParseException &exception)
{
qDebug(exception.message().toAscii());
return true;
}
http://www.slideshare.net/IgorShkulipa 27
Пример. Использование обработчика.
void MainWindow::on_pushButton_clicked()
{
ui->treeWidget->clear();
QFile *xmlFile=new QFile("D:abooks.xml");
QXmlInputSource* xmlInputSource=new QXmlInputSource(xmlFile);
QXmlSimpleReader* reader=new QXmlSimpleReader();
XmlBookHandler* handler=new XmlBookHandler(ui->treeWidget);
reader->setContentHandler(handler);
reader->parse(xmlInputSource);
}
http://www.slideshare.net/IgorShkulipa 28
Пример. Результат
http://www.slideshare.net/IgorShkulipa 29
Чтение XML при помощи DOM
DOM обеспечивает интерфейс для доступа и изменения содержимого и
структуры XML файла. Он создаёт иерархическое отображение
документа (в виде дерева). Эта -- в отличие о интерфейса SAX2 --
объектная модель документа составляется в памяти после анализа
документа, что делает её лёгкой для изменений.
Все узлы DOM в дереве документа являются подклассами QDomNode.
Сам документ представляется объектом QDomDocument.
http://www.slideshare.net/IgorShkulipa 30
Пример. DOM
void MainWindow::on_pushButton_2_clicked() {
ui->treeWidget_2->clear();
QFile *xmlFile=new QFile("D:abooks.xml");
QXmlInputSource* xmlInputSource=new QXmlInputSource(xmlFile);
QXmlSimpleReader* reader=new QXmlSimpleReader();
QDomDocument *doc=new QDomDocument();
doc->setContent(xmlInputSource,reader);
QDomNodeList nodeList=doc->childNodes();
QTreeWidgetItem *parentItem;
for (int i=0;i<nodeList.count();i++) {
if (nodeList.at(i).nodeName()==TAG_BOOKS) {
QDomNodeList books=nodeList.at(i).childNodes();
for (int j=0;j<books.count();j++) {
if (books.at(j).nodeName()==TAG_BOOK) {
QTreeWidgetItem *currentItem=new QTreeWidgetItem(ui->treeWidget_2);
QString text=TAG_BOOK+" ";
text+=books.at(j).toElement().attribute(ATTR_ID);
currentItem->setText(0, text);
parentItem=currentItem;
QDomNodeList bookParams=books.at(j).childNodes();
for (int k=0;k<bookParams.count();k++) {
if ((bookParams.at(k).nodeName()==TAG_NAME)||
(bookParams.at(k).nodeName()==TAG_AUTHOR)||
(bookParams.at(k).nodeName()==TAG_PAGES)||
(bookParams.at(k).nodeName()==TAG_YEAR)||
(bookParams.at(k).nodeName()==TAG_LANGUAGE))
{
QTreeWidgetItem *currentItem=new QTreeWidgetItem(parentItem);
currentItem->setText(0, bookParams.at(k).toElement().text());
} } } } } } }
http://www.slideshare.net/IgorShkulipa 31
Результат
http://www.slideshare.net/IgorShkulipa 32
Запись документов XML
Существует два основных подхода создания XML-файлов в приложениях
Qt:
• Построить дерево DOM и затем вызвать метод save().
• Вручную создать XML-файл
Выбор того или иного метода зависит от используемого парсера - SAX или
DOM.
http://www.slideshare.net/IgorShkulipa 33
Пример
void MainWindow::on_pushButton_4_clicked()
{
QFile *xmlFile=new QFile("D:abooks.xml");
QXmlInputSource* xmlInputSource=new QXmlInputSource(xmlFile);
QXmlSimpleReader* reader=new QXmlSimpleReader();
xmlFile->close();
QDomDocument *doc=new QDomDocument();
doc->setContent(xmlInputSource,reader);
QDomElement newBook=doc->createElement(TAG_BOOK);
newBook.setAttribute(ATTR_ID, "33333");
QDomElement newName=doc->createElement(TAG_NAME);
QDomText textName=doc->createTextNode("Kobzar");
newName.appendChild(textName);
QDomElement newAuthor=doc->createElement(TAG_AUTHOR);
QDomText textAuthor=doc->createTextNode("Taras Shevchenko");
newAuthor.appendChild(textAuthor);
QDomElement newPages=doc->createElement(TAG_PAGES);
QDomText textPages=doc->createTextNode("500");
newPages.appendChild(textPages);
http://www.slideshare.net/IgorShkulipa 34
Пример
QDomElement newYear=doc->createElement(TAG_YEAR);
QDomText textYear=doc->createTextNode("1840");
newYear.appendChild(textYear);
QDomElement newLanguage=doc->createElement(TAG_LANGUAGE);
QDomText textLanguage=doc->createTextNode("Ukrainian");
newLanguage.appendChild(textLanguage);
newBook.appendChild(newName);
newBook.appendChild(newAuthor);
newBook.appendChild(newPages);
newBook.appendChild(newYear);
newBook.appendChild(newLanguage);
doc->childNodes().at(1).appendChild(newBook);
xmlFile=new QFile("D:abooks.xml");
xmlFile->open(QIODevice::WriteOnly);
QTextStream outStream(xmlFile);
doc->save(outStream,0);
outStream.flush();
xmlFile->close();
}
http://www.slideshare.net/IgorShkulipa 35
Результат
http://www.slideshare.net/IgorShkulipa 36
Паттерн Memento (Хранитель)
Назначение паттерна Memento:
• Не нарушая инкапсуляции, паттерн Memento получает и сохраняет
за пределами объекта его внутреннее состояние так, чтобы позже
можно было восстановить объект в таком же состоянии.
• Является средством для инкапсуляции "контрольных точек"
программы.
• Паттерн Memento придает операциям "Отмена" (undo) или "Откат"
(rollback) статус "полноценного объекта".
Паттерн проектирования Memento определяет трех различных
участников:
• Originator (хозяин) - объект, умеющий создавать хранителя, а
также знающий, как восстановить свое внутреннее состояние из
хранителя.
• Caretaker (смотритель) - объект, который знает, почему и когда
хозяин должен сохранять и восстанавливать себя.
• Memento (хранитель) - "ящик на замке", который пишется и
читается хозяином и за которым присматривает смотритель.
http://www.slideshare.net/IgorShkulipa 37
Класс Memento и интерфейс IOriginator
class Memento
{
public:
string GetName(){return name;}
string GetSurname(){return surname;}
string GetMiddleName(){return middleName;}
void SetName(string sname){name=sname;}
void SetSurname(string ssname){surname=ssname;}
void SetMiddleName(string smname){middleName=smname;}
private:
string name;
string surname;
string middleName;
};
class IOriginator
{
public:
virtual Memento GetMemento()=0;
virtual void SetMemento(Memento memento)=0;
};
http://www.slideshare.net/IgorShkulipa 38
Класс для состояние, которого надо запомнить
class FullNameClass: public IOriginator {
public:
FullNameClass(string sname, string ssurname, string smiddle) {
name = sname; surname = ssurname; middleName = smiddle;
}
void Print() {
cout<<"Name="<<name<<" Surname="<<
surname<<" Middle="<<middleName<<"n";
}
virtual Memento GetMemento() {
Memento memento;
memento.SetName(name);
memento.SetMiddleName(middleName);
memento.SetSurname(surname);
return memento;
}
virtual void SetMemento(Memento memento){
name = memento.GetName();
surname = memento.GetSurname();
middleName = memento.GetMiddleName();
}
http://www.slideshare.net/IgorShkulipa 39
Класс для состояние, которого надо запомнить
public:
string GetName(){return name;}
string GetSurname(){return surname;}
string GetMiddleName(){return middleName;}
void SetName(string sname){name=sname;}
void SetSurname(string ssname){surname=ssname;}
void SetMiddleName(string smname){middleName=smname;}
private:
string name;
string surname;
string middleName;
};
http://www.slideshare.net/IgorShkulipa 40
Класс «Смотритель»
class Caretaker
{
public:
void SaveState(IOriginator& originator)
{
memento = originator.GetMemento();
}
void RestoreState(IOriginator& originator)
{
originator.SetMemento(memento);
}
private:
Memento memento;
};
http://www.slideshare.net/IgorShkulipa 41
Использование
int main(int argc, char* argv[])
{
FullNameClass fnc ("Ivan", "Ivanov", "Ivanovich");
Caretaker ct;
fnc.Print();
ct.SaveState(fnc);
fnc = FullNameClass("Petr", "Petrov", "Petrovich");
fnc.Print();
ct.RestoreState(fnc);
fnc.Print();
return 0;
}
Результат
Name=Ivan Surname=Ivanov Middle=Ivanovich
Name=Petr Surname=Petrov Middle=Petrovich
Name=Ivan Surname=Ivanov Middle=Ivanovich
http://www.slideshare.net/IgorShkulipa 42
Сериализация
Сериализация - это процесс сохранения объектов в долговременной
памяти (файлах) в период выполнения системы, а десериализация -
это обратный процесс, восстановление состояния объектов хранимых в
долговременной памяти.
http://www.slideshare.net/IgorShkulipa 43
Пример. Класс для сериализации
class FullName
{
public:
QString FirstName;
QString MiddleName;
QString LastName;
public:
void Serialize(QIODevice& file);
void Deserialize(QIODevice& file);
};
http://www.slideshare.net/IgorShkulipa 44
Пример. Сериализующий метод
void FullName::Serialize(QIODevice &file)
{
QString serial;
QXmlStreamWriter stream(&serial);
stream.setAutoFormatting(true);
stream.writeStartDocument();
stream.writeStartElement("fullName");
stream.writeAttribute("id", "1");
stream.writeTextElement("FirstName",this->FirstName);
stream.writeTextElement("MiddleName",this->MiddleName);
stream.writeTextElement("LastName",this->LastName);
stream.writeEndElement();
stream.writeEndDocument();
file.open(QIODevice::WriteOnly);
file.write(serial.toAscii());
file.close();
}
http://www.slideshare.net/IgorShkulipa 45
Пример. Десериализующий метод
void FullName::Deserialize(QIODevice &file)
{
file.open(QIODevice::ReadOnly);
QXmlStreamReader stream(&file);
while(!stream.atEnd())
{
QXmlStreamReader::TokenType token=stream.readNext();
if (stream.isStartElement())
{
if (stream.name()=="FirstName") {
this->FirstName=stream.readElementText();
}
if (stream.name()=="LastName") {
this->LastName=stream.readElementText();
}
if (stream.name()=="MiddleName") {
this->MiddleName=stream.readElementText();
}
}
}
file.close();
}
http://www.slideshare.net/IgorShkulipa 46
Пример. Использование
void MainWindow::on_pushButton_3_clicked()
{
FullName fullName;
fullName.FirstName="Ivan";
fullName.LastName="Ivanov";
fullName.MiddleName="Ivanovich";
QFile out("D:afullName.xml");
fullName.Serialize(out);
fullName.FirstName="Petr";
fullName.LastName="Petrov";
fullName.MiddleName="Petrovich";
QFile in("D:afullName.xml");
fullName.Deserialize(in);
fullName.Serialize(in);
}
http://www.slideshare.net/IgorShkulipa 47
Лабораторная работа №6. XML
Добавить к тетрису возможность сохранения текущего состояния игры в
формате XML.
Данные, которые необходимо сохранять для каждого пользователя:
• проведенные игры с момента логина пользователя
• дата/время, продолжительность игр
• счет в каждой игре
• если последняя игра не закончена, то ее текущее состояние

Contenu connexe

Tendances

C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологииUnguryan Vitaliy
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Anton Moiseenko
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.Igor Shkulipa
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в javaUnguryan Vitaliy
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.Unguryan Vitaliy
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействиеUnguryan Vitaliy
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Unguryan Vitaliy
 
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIEkaterina Kuchinskaya
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6Technopark
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroAnton Moiseenko
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 

Tendances (20)

C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C# Desktop. Занятие 04.
C# Desktop. Занятие 04.C# Desktop. Занятие 04.
C# Desktop. Занятие 04.
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Java. Многопоточность.
Java. Многопоточность.Java. Многопоточность.
Java. Многопоточность.
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.Java. Работа с файловой системой. Потоки ввода-вывода.
Java. Работа с файловой системой. Потоки ввода-вывода.
 
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet APIПротокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
 
Java Core. Lecture# 1. Intro
Java Core. Lecture# 1. IntroJava Core. Lecture# 1. Intro
Java Core. Lecture# 1. Intro
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Сервлеты
СервлетыСервлеты
Сервлеты
 

En vedette

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03. Igor Shkulipa
 
Production diary 14
Production diary 14Production diary 14
Production diary 14Laila Jaleel
 
Advanced LinkedIn Techniques
Advanced LinkedIn TechniquesAdvanced LinkedIn Techniques
Advanced LinkedIn TechniquesJames Weber
 
Trabajo completo correcion
Trabajo completo correcionTrabajo completo correcion
Trabajo completo correcionIda Morán
 
power point of extra material about eye trauma
power point of extra material about eye traumapower point of extra material about eye trauma
power point of extra material about eye traumaEman Elnezami
 
Production diary 15
Production diary 15Production diary 15
Production diary 15Laila Jaleel
 
C# Web. Занятие 03.
C# Web. Занятие 03.C# Web. Занятие 03.
C# Web. Занятие 03.Igor Shkulipa
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.Igor Shkulipa
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.Igor Shkulipa
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.Igor Shkulipa
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.Igor Shkulipa
 
Capítulo iii correcion
Capítulo iii correcion Capítulo iii correcion
Capítulo iii correcion Ida Morán
 
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9vijay bhosekar
 
Production diary 7
Production diary 7Production diary 7
Production diary 7Laila Jaleel
 
Fotos de la tesis
Fotos de la tesisFotos de la tesis
Fotos de la tesisIda Morán
 

En vedette (20)

Общие темы. Тема 03.
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
 
Production diary 14
Production diary 14Production diary 14
Production diary 14
 
Nowhere But Niigata
Nowhere But NiigataNowhere But Niigata
Nowhere But Niigata
 
Advanced LinkedIn Techniques
Advanced LinkedIn TechniquesAdvanced LinkedIn Techniques
Advanced LinkedIn Techniques
 
Apokries2015
Apokries2015Apokries2015
Apokries2015
 
Truly Verona
Truly VeronaTruly Verona
Truly Verona
 
Trabajo completo correcion
Trabajo completo correcionTrabajo completo correcion
Trabajo completo correcion
 
power point of extra material about eye trauma
power point of extra material about eye traumapower point of extra material about eye trauma
power point of extra material about eye trauma
 
Production diary 15
Production diary 15Production diary 15
Production diary 15
 
C# Web. Занятие 03.
C# Web. Занятие 03.C# Web. Занятие 03.
C# Web. Занятие 03.
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
C# Web. Занятие 12.
C# Web. Занятие 12.C# Web. Занятие 12.
C# Web. Занятие 12.
 
Общие темы. Тема 01.
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.
 
InPay OpenReaktor
InPay OpenReaktorInPay OpenReaktor
InPay OpenReaktor
 
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 09.
 
Capítulo iii correcion
Capítulo iii correcion Capítulo iii correcion
Capítulo iii correcion
 
Emergency Assistance
Emergency AssistanceEmergency Assistance
Emergency Assistance
 
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9Vijay Bhosekar_ PP_Rodale Institute_Feb 9
Vijay Bhosekar_ PP_Rodale Institute_Feb 9
 
Production diary 7
Production diary 7Production diary 7
Production diary 7
 
Fotos de la tesis
Fotos de la tesisFotos de la tesis
Fotos de la tesis
 

Similaire à C++ STL & Qt. Занятие 06.

C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.Igor Shkulipa
 
компьютерные сети
компьютерные сетикомпьютерные сети
компьютерные сетиellin55
 
File input/output in VHDL
File input/output in VHDLFile input/output in VHDL
File input/output in VHDLvitaliykulanov
 
Msu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced XmlMsu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced Xmlolegol
 
Design of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XMLDesign of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XMLAnton Moiseenko
 
идеология Drupal 8 уже в drupal 7 вячеслав касихин
идеология Drupal 8 уже в drupal 7 вячеслав касихинидеология Drupal 8 уже в drupal 7 вячеслав касихин
идеология Drupal 8 уже в drupal 7 вячеслав касихинdrupalconf
 
06 Ввод-вывод
06 Ввод-вывод06 Ввод-вывод
06 Ввод-выводphearnot
 
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...vitaliykulanov
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEBAlexandre Kalendarev
 
Data Destribution service OMG standart
Data Destribution service OMG standart Data Destribution service OMG standart
Data Destribution service OMG standart Sergei Seleznev
 
Java. Lecture 07. Advanced XML
Java. Lecture 07. Advanced XMLJava. Lecture 07. Advanced XML
Java. Lecture 07. Advanced XMLcolriot
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXMLSlach
 
Лекция #3. Введение в языки разметки web-страниц
Лекция #3. Введение в языки разметки web-страницЛекция #3. Введение в языки разметки web-страниц
Лекция #3. Введение в языки разметки web-страницЯковенко Кирилл
 
4. стандарты html
4. стандарты html4. стандарты html
4. стандарты htmlSergei Dubrov
 
Msu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 IoMsu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 Ioolegol
 

Similaire à C++ STL & Qt. Занятие 06. (20)

C# Desktop. Занятие 09.
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.
 
XSLT - 1
XSLT - 1XSLT - 1
XSLT - 1
 
HTML
HTMLHTML
HTML
 
компьютерные сети
компьютерные сетикомпьютерные сети
компьютерные сети
 
File input/output in VHDL
File input/output in VHDLFile input/output in VHDL
File input/output in VHDL
 
Введение в DOM
Введение в DOMВведение в DOM
Введение в DOM
 
Msu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced XmlMsu.Center.Lectures.J07 Advanced Xml
Msu.Center.Lectures.J07 Advanced Xml
 
Design of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XMLDesign of Information Systems. Lecture #1. XML
Design of Information Systems. Lecture #1. XML
 
идеология Drupal 8 уже в drupal 7 вячеслав касихин
идеология Drupal 8 уже в drupal 7 вячеслав касихинидеология Drupal 8 уже в drupal 7 вячеслав касихин
идеология Drupal 8 уже в drupal 7 вячеслав касихин
 
XML
XMLXML
XML
 
Html лаб 2
Html лаб 2Html лаб 2
Html лаб 2
 
06 Ввод-вывод
06 Ввод-вывод06 Ввод-вывод
06 Ввод-вывод
 
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
Basic principles of projects description in VHDL - ENTITY, ARCHITECTURE, LIBR...
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
Data Destribution service OMG standart
Data Destribution service OMG standart Data Destribution service OMG standart
Data Destribution service OMG standart
 
Java. Lecture 07. Advanced XML
Java. Lecture 07. Advanced XMLJava. Lecture 07. Advanced XML
Java. Lecture 07. Advanced XML
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXML
 
Лекция #3. Введение в языки разметки web-страниц
Лекция #3. Введение в языки разметки web-страницЛекция #3. Введение в языки разметки web-страниц
Лекция #3. Введение в языки разметки web-страниц
 
4. стандарты html
4. стандарты html4. стандарты html
4. стандарты html
 
Msu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 IoMsu.Center.Lectures.J06 Io
Msu.Center.Lectures.J06 Io
 

Plus de Igor Shkulipa

Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.Igor Shkulipa
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.Igor Shkulipa
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.Igor Shkulipa
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.Igor Shkulipa
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.Igor Shkulipa
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.Igor Shkulipa
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.Igor Shkulipa
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.Igor Shkulipa
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.Igor Shkulipa
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.Igor Shkulipa
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.Igor Shkulipa
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.Igor Shkulipa
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.Igor Shkulipa
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.Igor Shkulipa
 

Plus de Igor Shkulipa (20)

Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
 
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
 
C# Web. Занятие 08.
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.
 
C# Web. Занятие 07.
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
C# Web. Занятие 14.
C# Web. Занятие 14.C# Web. Занятие 14.
C# Web. Занятие 14.
 
C# Web. Занятие 15.
C# Web. Занятие 15.C# Web. Занятие 15.
C# Web. Занятие 15.
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 

C++ STL & Qt. Занятие 06.

  • 1. Темы лекции: Работа с XML. Практическое задание: Работа с XML. Тренер: Игорь Шкулипа, к.т.н. С++ Библиотеки STL и Qt. Занятие 6
  • 2. http://www.slideshare.net/IgorShkulipa 2 Файловый ввод-вывод Qt предоставляет свою собственную поддержку операций для работы с файлами, состоящую из следующих классов: • QDir — для работы с директориями; • QFile — для работы с файлами; • QFileInfо — для получения файловой информации; • QIODevice — абстрактный класс для ввода/вывода; • QBuffer — для буферизации файлов в памяти компьютера.
  • 3. http://www.slideshare.net/IgorShkulipa 3 QIODevice QIODevice — это абстрактный класс, обобщающий устройство ввода/вывода, который содержит виртуальные методы для открытия и закрытия устройства ввода/вывода, а также для чтения и записи блоков данных или отдельных символов. Реализация конкретного устройства происходит в унаследованных классах. В Qt есть четыре класса, наследующие класс QIODevice: • QFile — класс для проведения операций с файлами; • QBuffer — позволяет записывать и считывать данные в массив QByteArray, как будто бы это устройство или файл; • QAbstractSocket — базовый класс для сетевой коммуникации посредством сокетов. • QProcess — этот класс предоставляет возможность запуска процессов с дополнительными аргументами и позволяет обмениваться информацией с этими процессами посредством методов, определенных в QIODevice.
  • 4. http://www.slideshare.net/IgorShkulipa 4 Открытие QIODevice Для работы с устройством его необходимо открыть в одном из режимов, определенных В заголовочном файле класса QIODevice. Для того чтобы в любой момент времени исполнения программы узнать, в каком из режимов было открыто устройство, нужно вызвать метод openMode(). • QIODevice::NotOpen — устройство не открыто (это значение не имеет смысла передавать в метод open()); • QIODevice::ReadOnly — открытие устройства только для чтения данных; • QIODevice::writeOnly — открытие устройства только для записи данных; • QIODevice::ReadWrite — открытие устройства для чтения и записи данных (то же, что и IO_ReadOnly | IO_WriteOnly); • QIODevice::Append — открытие устройства для добавления данных; • QIODevice::Unbuffered — открытие для непосредственного доступа к данным, в обход промежуточных буферов чтения и записи; • QIODevice::Text — применяются преобразования символов переноса строки в зависимости от платформы. Для ОС Windows, например — rn, а для MacOS X и UNIX — /r; • QIODevice::Truncate — все данные устройства, по возможности, должны быть удалены при открытии.
  • 5. http://www.slideshare.net/IgorShkulipa 5 Чтение-запись Считывать и записывать данные можно с помощью методов read() и write() соответственно. Для чтения всех данных сразу определен метод readAll(), который возвращает их в объекте типа QByteArray. Строку или символ можно прочитать методами readLine() и getChar() соответственно. В классе QIODevice определен метод для смены текущего положения seek(). Получить текущее положение можно вызовом метода pos(). Но не забывайте, что эти методы применимы только для прямого доступа к данным. При последовательном доступе, каким является сетевое соединение, они теряют смысл. Более того, в этом случае теряет смысл и метод size(), возвращающий размер данных устройства. Все эти операции применимы только для QFile, QBuffer и QTemporaryFile. Для создания собственного класса устройства ввода/вывода, для которого Qt не предоставляет поддержки, необходимо унаследовать класс QIODevice и реализовать в нем методы readData() и writeData(). В большинстве случаев может потребоваться перезаписать методы open(), close() и atEnd().
  • 6. http://www.slideshare.net/IgorShkulipa 6 XML XML (eXtensible Markup Language, или расширяемый язык разметки) — это язык описания документов, во многом похожий на язык разметки гипертекста HTML, но гораздо более универсальный, чем HTML. XML — текстовый формат, предназначенный для хранения структурированных данных (взамен существующих файлов баз данных), для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML), иногда называемых словарями. Пример: <?xml version="1.0"?> <list_of_items> <item id="1"> <first/>Первый</item> <item id="2">Второй <sub_item>подпункт 1</sub_item> </item> <last/>Последний</item> </list_of_items>
  • 7. http://www.slideshare.net/IgorShkulipa 7 Формат XML-файла Первая строка XML документа называется объявлением XML (declaration) это необязательная строка, указывающая версию стандарта XML. Здесь может быть указана кодировка символов и внешние зависимости.: <?xml version="1.0" encoding=“windows-1251"?> Далее идут элементы документа, разделенные открывающими и закрывающими тэгами. Каждый элемент имеет имя, которым начинается открывающий тэг элемента и заканчивается закрывающий. Содержимым элемента (content), называется всё, что расположено между открывающим и закрывающим тегами. Все значения атрибутов должны быть в одинарных или двойных кавычках. Каждый XML документ обязательно содержит один корневой элемент (report) и сколько угодно вложенных элементов (place, measurement). Любой вложенный элемент также может иметь свои вложенные элементы. Комментарии вводятся конструкцией: <!-- Текст комментария --> Текстовые данные в XML называются сущностью (entity). Текст может содержать спецсимволы (некоторые символы запрещены) ссылки на сущность (entity references). Кодировка спецсимволов в XML аналогична HTML: &amp; & &lt < &gt; > &apos; ' &quot; " &nbsp; пробел.
  • 8. http://www.slideshare.net/IgorShkulipa 8 В 1980-е годы был разработан - SGML (Standard Generalized Markup Language) ◦ разработан для МО США; задача - снизить расходы на передачу документации ◦ четкая иерархическая структурированность информации; ◦ расширяемость стандарта ◦ отделение информации от представления (использование DTD - Document Type Definition) ◦ слишком сложен для реализации в Web (Sounds Good, Maybe Later) Предыстория XML: SGML
  • 9. http://www.slideshare.net/IgorShkulipa 9 • Документ называется действительным, если он имеет связанное с ним определение типа документа (схему) и соответствует ему • В XML 1.0 единственным типом схем является DTD – Document Type Definition • DTD основано на упрощенном формате SGML и было создано для нужд EDI (Electronic Data Interchange) • Синтаксис DTD существенно отличается от XML Определение типа документа (DTD) <!ELEMENT Joke (Setup, Punchline) > <!ATTLIST Joke author CDATA #REQUIRED firstTold CDATA #IMPLIED > <!ELEMENT Setup (#PCDATA) > <!ELEMENT Punchline (#PCDATA) > <?xml version="1.0"?> <!DOCTYPE Joke SYSTEM "Joke.dtd"> <Joke author="Groucho Marx"> <Setup>Outside of a dog, a book is man's best friend</Setup> <Punchline>Inside of a dog, it's too dark to read.</Punchline> </Joke>
  • 10. http://www.slideshare.net/IgorShkulipa 10 Проблемы DTD ● DTD - строго иерархический формат, плохо подходящий для меняющихся документов ● У документа может быть только один тип, что не очень удобно для коммерческих приложений ● Синтаксис DTD не похож на XML и плохо воспринимается человеком ● В DTD допустимо использование только текстового типа данных (нет числового типа или даты)
  • 11. http://www.slideshare.net/IgorShkulipa 11 XML-схемы ● Схемы должны следовать синтаксису XML ● Стандарт схемы должен поддерживать распространенные типы данных (число, дата…) ● Схема XML должна быть открытой для подключения внешних источников ● Метод разрешения неоднозначности имен при соединении двух файлов - пространства имен.
  • 12. http://www.slideshare.net/IgorShkulipa 12 XML Schema XML Schema – промышленный стандарт описания XML-документов XML Schema делает следующее: • Описывает названия элементов и атрибутов (словарь). • Описывает взаимосвязь между элементами и атрибутами, а также их структуру (модель содержания). • Описывает типы данных. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="книга" type="Книга" /> <xs:complexType name="Книга"> <xs:sequence> <xs:element name="название" type="xs:string" /> <xs:element name="цена" type="xs:decimal" /> </xs:sequence> </xs:complexType> </xs:schema>
  • 13. http://www.slideshare.net/IgorShkulipa 13 Document Object Model • Объектная модель документа открывает доступ к XML-документу как к древовидной структуре в памяти • Позволяет работать с XML-документом как с обычным объектом в любом современном языке программирования • Перед началом работы DOM требует загрузки всего документа в память (поэтому разрабатываются и альтернативные стандарты) • Стандарт оставляет разработчикам большую свободу в интерпретации • Microsoft предлагает MS XML DOM 3.0, интегрированную в продукты Microsoft XPath XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML
  • 14. http://www.slideshare.net/IgorShkulipa 14 XSLT XSLT (eXtensible Stylesheet Language Transformations) — язык преобразования XML-документов. Спецификация XSLT входит в состав XSL и является рекомендацией W3C. При применении таблицы стилей XSLT, состоящей из набора шаблонов, к XML-документу (исходное дерево) образуется конечное дерево, которое может быть сериализовано в виде XML-документа, XHTML-документа, HTML-документа или простого текстового файла. XSLT имеет множество различных применений, в основном в области web- программирования и генерации отчётов. Одной из задач, решаемых языком XSLT, является отделение данных от их представления, как часть общей парадигмы MVC. XQuery XQuery — язык запросов, разработанный для обработки данных в формате XML. XQuery использует XML как свою модель данных.
  • 15. http://www.slideshare.net/IgorShkulipa 15 Достоинства XML • XML — язык разметки, позволяющий отобразить двоичные данные в текст, читаемый человеком и анализируемый компьютером; • XML поддерживает Юникод; • в формате XML могут быть описаны такие структуры данных как записи, списки и деревья; • XML — это самодокументируемый формат, который описывает структуру и имена полей так же как и значения полей; • XML имеет строго определённый синтаксис и требования к анализу, что позволяет ему оставаться простым, эффективным и непротиворечивым. Одновременно с этим, разные разработчики не ограничены в выборе экспрессивных методов (например, можно моделировать данные, помещая значения в параметры тегов или в тело тегов, можно использовать различные языки и нотации для именования тегов и т. д.); • XML — формат, основанный на международных стандартах; • Иерархическая структура XML подходит для описания практически любых типов документов, кроме аудио и видео мультимедийных потоков, растровых изображений, сетевых структур данных и двоичных данных; • XML представляет собой простой текст, свободный от лицензирования и каких- либо ограничений; • XML не зависит от платформы;
  • 16. http://www.slideshare.net/IgorShkulipa 16 Достоинства XML • XML является подмножеством SGML (который используется с 1986 года). Уже накоплен большой опыт работы с языком и созданы специализированные приложения; • XML не накладывает требований на расположение символов в строке; • В отличие от бинарных форматов, XML содержит метаданные об именах, типах и классах описываемых объектов, по которым приложение может обработать документ неизвестной структуры (например, для динамического построения интерфейсов); • XML имеет реализации парсеров для всех современных языков программирования; • XML поддерживается на низком аппаратном, микропрограммном и программном уровнях в современных аппаратных решениях.
  • 17. http://www.slideshare.net/IgorShkulipa 17 Недостатки XML • Синтаксис XML избыточен. • Размер XML-документа существенно больше бинарного представления тех же данных. В грубых оценках величину этого фактора принимают за 1 порядок (в 10 раз). • Размер XML-документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON, YAML) и особенно в форматах данных, оптимизированных для конкретного случая использования. • Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных. • XML содержит метаданные (об именах полей, классов, вложенности структур), и одновременно XML позиционируется как язык взаимодействия открытых систем. При передаче между системами большого количества объектов одного типа (одной структуры), передавать метаданные повторно нет смысла, хотя они содержатся в каждом экземпляре XML описания. • Для большого количества задач не нужна вся мощь синтаксиса XML и можно использовать значительно более простые и производительные решения. • Неоднозначность моделирования. • Нет общепринятой методологии для моделирования данных в XML, в то время как для реляционной модели и объектно-ориентированной такие средства разработаны и базируются на реляционной алгебре, системном подходе и системном анализе.
  • 18. http://www.slideshare.net/IgorShkulipa 18 Недостатки XML • В природе есть множество объектов и явлений, для описания которых разные структуры данных (сетевая, реляционная, иерархическая) являются естественными, и отображение объекта в неестественную для него модель является болезненным для его сути. В случае с реляционной и иерархической моделями определены процедуры декомпозиции, обеспечивающие относительную однозначность, чего нельзя сказать о сетевой модели. • В результате большой гибкости языка и отсутствия строгих ограничений, одна и та же структура может быть представлена множеством способов (различными разработчиками), например, значение может быть записано как атрибут тега или как тело тега и т. д. Например: <a b="1" c="1"/> или <a b="1" c="1"></a> или <a><b>1</b><c>1</c></a> или <a><c value="1"/></a> или <a><fields b="1" c="1"/></a> и т. д. • Поддержка многих языков в именовании тегов дает возможность назвать, например вес русским словом, в таком случае компьютер никак не сможет установить соответствия этого поля с полем weight в англоязычной версии программы и с полями в версиях модели объекта на множестве других языков. • XML не содержит встроенной в язык поддержки типов данных. В нём нет строгой типизации, то есть понятий «целых чисел», «строк», «дат», «булевых значений» и т. д. • Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной моделью и объектно-ориентированными графами и сетевой моделью данных. • Выражение неиерархических данных (например графов) требует дополнительных усилий. • Кристофер Дейт, специалист в области реляционных баз данных, автор классического учебника «An Introduction to Database Systems», отмечал, что «…XML является попыткой заново изобрести иерархические базы данных…» (в 1980-е года иерархические базы данных были вытеснены реляционными базами данных). • Пространства имён XML сложно использовать и их сложно реализовывать в XML-парсерах. • Существуют другие, обладающие сходными с XML возможностями, текстовые форматы данных, которые обладают более высоким удобством чтения человеком (YAML, JSON, SweetXML, XF).
  • 19. http://www.slideshare.net/IgorShkulipa 19 XML в Qt Qt обеспечивает два программных интерфейса для чтения XML – SAX и DOM, эти интерфейсы входят в состав QtXml. • SAX – Simple API for XML. Позволяет обрабатывать события синтаксического анализа непосредственно в приложении в соответствующих виртуальных методах. • DOM – Document Object Model. Преобразует документ XML в древовидную структуру, которая затем может обрабатываться в приложении.
  • 20. http://www.slideshare.net/IgorShkulipa 20 Чтение XML при помощи SAX Qt обеспечивает построенный на основе интерфейса SAX парсер документов XML, не предусматривающий проверку их достоверности под названием QXmlSimpleReader. Этот парсер распознает хорошо сформированные документы XML и поддерживает пространства имен XML. Когда парсер обрабатывает документ, он вызывает виртуальные функции в зарегистрированных классах—обработчиках, уведомляющих о возникновении соответствующих событий в ходе синтаксического анализа документа. При чтении документа, парсер вызовет следующие обработчики событий синтаксического анализа: • startDocument() • startElement() • characters() • endElement() • endDocument() Все приведенные выше функции объявлены в абстрактном классе QXmlContentHandler и должны быть реализованы в конкретном обработчике.
  • 21. http://www.slideshare.net/IgorShkulipa 21 Пример. XML <?xml version="1.0"?> <books> <book id="11111"> <name>Song of Ice and Fire</name> <author>George R.R. Martin</author> <pages>100500</pages> <year>2011</year> <language>English</language> </book> <book id="22222"> <name>War and Peace</name> <author>Lev Tolstoy</author> <pages>200500</pages> <year>1869</year> <language>Russian</language> </book> </books>
  • 22. http://www.slideshare.net/IgorShkulipa 22 Пример. Класс-обработчик class XmlBookHandler : public QXmlDefaultHandler { public: XmlBookHandler(QTreeWidget* treeWidget); bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts); bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName); bool characters(const QString &ch); bool fatalError(const QXmlParseException &exception); ~XmlBookHandler(); private: QTreeWidget* treeWidget; QTreeWidgetItem* currentItem; QTreeWidgetItem* parentItem; QString currentText; private: static const QString TAG_BOOKS; static const QString TAG_BOOK; static const QString TAG_NAME; static const QString TAG_AUTHOR; static const QString TAG_PAGES; static const QString TAG_YEAR; static const QString TAG_LANGUAGE; static const QString ATTR_ID; };
  • 23. http://www.slideshare.net/IgorShkulipa 23 Пример. Реализация обработчика const QString XmlBookHandler::TAG_BOOKS=QString("books"); const QString XmlBookHandler::TAG_BOOK=QString("book"); const QString XmlBookHandler::TAG_NAME=QString("name"); const QString XmlBookHandler::TAG_AUTHOR=QString("author"); const QString XmlBookHandler::TAG_PAGES=QString("pages"); const QString XmlBookHandler::TAG_YEAR=QString("year"); const QString XmlBookHandler::TAG_LANGUAGE=QString("language"); const QString XmlBookHandler::ATTR_ID=QString("id"); XmlBookHandler::XmlBookHandler(QTreeWidget* treeWidget) { this->treeWidget=treeWidget; this->currentItem=0; this->parentItem=0; } XmlBookHandler::~XmlBookHandler() { }
  • 24. http://www.slideshare.net/IgorShkulipa 24 Пример. Реализация обработчика. startElement() bool XmlBookHandler::startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts) { if (qName==TAG_BOOK) { if (!currentItem) { currentItem=new QTreeWidgetItem(treeWidget); parentItem=currentItem; }else { currentItem=new QTreeWidgetItem(currentItem); } currentItem->setText( 0, TAG_BOOK+" "+atts.value(ATTR_ID)); } return true; }
  • 25. http://www.slideshare.net/IgorShkulipa 25 Пример. Реализация обработчика. endElement() bool XmlBookHandler::endElement(const QString &namespaceURI, const QString &localName, const QString &qName) { if (qName==TAG_BOOK) { currentItem=0; }else { if ((qName==TAG_NAME)|| (qName==TAG_AUTHOR)|| (qName==TAG_PAGES)|| (qName==TAG_YEAR)|| (qName==TAG_LANGUAGE)) { currentItem=new QTreeWidgetItem(currentItem); currentItem->setText(0, currentText); } currentItem=parentItem; } return true; }
  • 26. http://www.slideshare.net/IgorShkulipa 26 Пример. Реализация обработчика. characters() и fatalError() bool XmlBookHandler::characters(const QString &ch) { currentText=QString(ch); return true; } bool XmlBookHandler::fatalError( const QXmlParseException &exception) { qDebug(exception.message().toAscii()); return true; }
  • 27. http://www.slideshare.net/IgorShkulipa 27 Пример. Использование обработчика. void MainWindow::on_pushButton_clicked() { ui->treeWidget->clear(); QFile *xmlFile=new QFile("D:abooks.xml"); QXmlInputSource* xmlInputSource=new QXmlInputSource(xmlFile); QXmlSimpleReader* reader=new QXmlSimpleReader(); XmlBookHandler* handler=new XmlBookHandler(ui->treeWidget); reader->setContentHandler(handler); reader->parse(xmlInputSource); }
  • 29. http://www.slideshare.net/IgorShkulipa 29 Чтение XML при помощи DOM DOM обеспечивает интерфейс для доступа и изменения содержимого и структуры XML файла. Он создаёт иерархическое отображение документа (в виде дерева). Эта -- в отличие о интерфейса SAX2 -- объектная модель документа составляется в памяти после анализа документа, что делает её лёгкой для изменений. Все узлы DOM в дереве документа являются подклассами QDomNode. Сам документ представляется объектом QDomDocument.
  • 30. http://www.slideshare.net/IgorShkulipa 30 Пример. DOM void MainWindow::on_pushButton_2_clicked() { ui->treeWidget_2->clear(); QFile *xmlFile=new QFile("D:abooks.xml"); QXmlInputSource* xmlInputSource=new QXmlInputSource(xmlFile); QXmlSimpleReader* reader=new QXmlSimpleReader(); QDomDocument *doc=new QDomDocument(); doc->setContent(xmlInputSource,reader); QDomNodeList nodeList=doc->childNodes(); QTreeWidgetItem *parentItem; for (int i=0;i<nodeList.count();i++) { if (nodeList.at(i).nodeName()==TAG_BOOKS) { QDomNodeList books=nodeList.at(i).childNodes(); for (int j=0;j<books.count();j++) { if (books.at(j).nodeName()==TAG_BOOK) { QTreeWidgetItem *currentItem=new QTreeWidgetItem(ui->treeWidget_2); QString text=TAG_BOOK+" "; text+=books.at(j).toElement().attribute(ATTR_ID); currentItem->setText(0, text); parentItem=currentItem; QDomNodeList bookParams=books.at(j).childNodes(); for (int k=0;k<bookParams.count();k++) { if ((bookParams.at(k).nodeName()==TAG_NAME)|| (bookParams.at(k).nodeName()==TAG_AUTHOR)|| (bookParams.at(k).nodeName()==TAG_PAGES)|| (bookParams.at(k).nodeName()==TAG_YEAR)|| (bookParams.at(k).nodeName()==TAG_LANGUAGE)) { QTreeWidgetItem *currentItem=new QTreeWidgetItem(parentItem); currentItem->setText(0, bookParams.at(k).toElement().text()); } } } } } } }
  • 32. http://www.slideshare.net/IgorShkulipa 32 Запись документов XML Существует два основных подхода создания XML-файлов в приложениях Qt: • Построить дерево DOM и затем вызвать метод save(). • Вручную создать XML-файл Выбор того или иного метода зависит от используемого парсера - SAX или DOM.
  • 33. http://www.slideshare.net/IgorShkulipa 33 Пример void MainWindow::on_pushButton_4_clicked() { QFile *xmlFile=new QFile("D:abooks.xml"); QXmlInputSource* xmlInputSource=new QXmlInputSource(xmlFile); QXmlSimpleReader* reader=new QXmlSimpleReader(); xmlFile->close(); QDomDocument *doc=new QDomDocument(); doc->setContent(xmlInputSource,reader); QDomElement newBook=doc->createElement(TAG_BOOK); newBook.setAttribute(ATTR_ID, "33333"); QDomElement newName=doc->createElement(TAG_NAME); QDomText textName=doc->createTextNode("Kobzar"); newName.appendChild(textName); QDomElement newAuthor=doc->createElement(TAG_AUTHOR); QDomText textAuthor=doc->createTextNode("Taras Shevchenko"); newAuthor.appendChild(textAuthor); QDomElement newPages=doc->createElement(TAG_PAGES); QDomText textPages=doc->createTextNode("500"); newPages.appendChild(textPages);
  • 34. http://www.slideshare.net/IgorShkulipa 34 Пример QDomElement newYear=doc->createElement(TAG_YEAR); QDomText textYear=doc->createTextNode("1840"); newYear.appendChild(textYear); QDomElement newLanguage=doc->createElement(TAG_LANGUAGE); QDomText textLanguage=doc->createTextNode("Ukrainian"); newLanguage.appendChild(textLanguage); newBook.appendChild(newName); newBook.appendChild(newAuthor); newBook.appendChild(newPages); newBook.appendChild(newYear); newBook.appendChild(newLanguage); doc->childNodes().at(1).appendChild(newBook); xmlFile=new QFile("D:abooks.xml"); xmlFile->open(QIODevice::WriteOnly); QTextStream outStream(xmlFile); doc->save(outStream,0); outStream.flush(); xmlFile->close(); }
  • 36. http://www.slideshare.net/IgorShkulipa 36 Паттерн Memento (Хранитель) Назначение паттерна Memento: • Не нарушая инкапсуляции, паттерн Memento получает и сохраняет за пределами объекта его внутреннее состояние так, чтобы позже можно было восстановить объект в таком же состоянии. • Является средством для инкапсуляции "контрольных точек" программы. • Паттерн Memento придает операциям "Отмена" (undo) или "Откат" (rollback) статус "полноценного объекта". Паттерн проектирования Memento определяет трех различных участников: • Originator (хозяин) - объект, умеющий создавать хранителя, а также знающий, как восстановить свое внутреннее состояние из хранителя. • Caretaker (смотритель) - объект, который знает, почему и когда хозяин должен сохранять и восстанавливать себя. • Memento (хранитель) - "ящик на замке", который пишется и читается хозяином и за которым присматривает смотритель.
  • 37. http://www.slideshare.net/IgorShkulipa 37 Класс Memento и интерфейс IOriginator class Memento { public: string GetName(){return name;} string GetSurname(){return surname;} string GetMiddleName(){return middleName;} void SetName(string sname){name=sname;} void SetSurname(string ssname){surname=ssname;} void SetMiddleName(string smname){middleName=smname;} private: string name; string surname; string middleName; }; class IOriginator { public: virtual Memento GetMemento()=0; virtual void SetMemento(Memento memento)=0; };
  • 38. http://www.slideshare.net/IgorShkulipa 38 Класс для состояние, которого надо запомнить class FullNameClass: public IOriginator { public: FullNameClass(string sname, string ssurname, string smiddle) { name = sname; surname = ssurname; middleName = smiddle; } void Print() { cout<<"Name="<<name<<" Surname="<< surname<<" Middle="<<middleName<<"n"; } virtual Memento GetMemento() { Memento memento; memento.SetName(name); memento.SetMiddleName(middleName); memento.SetSurname(surname); return memento; } virtual void SetMemento(Memento memento){ name = memento.GetName(); surname = memento.GetSurname(); middleName = memento.GetMiddleName(); }
  • 39. http://www.slideshare.net/IgorShkulipa 39 Класс для состояние, которого надо запомнить public: string GetName(){return name;} string GetSurname(){return surname;} string GetMiddleName(){return middleName;} void SetName(string sname){name=sname;} void SetSurname(string ssname){surname=ssname;} void SetMiddleName(string smname){middleName=smname;} private: string name; string surname; string middleName; };
  • 40. http://www.slideshare.net/IgorShkulipa 40 Класс «Смотритель» class Caretaker { public: void SaveState(IOriginator& originator) { memento = originator.GetMemento(); } void RestoreState(IOriginator& originator) { originator.SetMemento(memento); } private: Memento memento; };
  • 41. http://www.slideshare.net/IgorShkulipa 41 Использование int main(int argc, char* argv[]) { FullNameClass fnc ("Ivan", "Ivanov", "Ivanovich"); Caretaker ct; fnc.Print(); ct.SaveState(fnc); fnc = FullNameClass("Petr", "Petrov", "Petrovich"); fnc.Print(); ct.RestoreState(fnc); fnc.Print(); return 0; } Результат Name=Ivan Surname=Ivanov Middle=Ivanovich Name=Petr Surname=Petrov Middle=Petrovich Name=Ivan Surname=Ivanov Middle=Ivanovich
  • 42. http://www.slideshare.net/IgorShkulipa 42 Сериализация Сериализация - это процесс сохранения объектов в долговременной памяти (файлах) в период выполнения системы, а десериализация - это обратный процесс, восстановление состояния объектов хранимых в долговременной памяти.
  • 43. http://www.slideshare.net/IgorShkulipa 43 Пример. Класс для сериализации class FullName { public: QString FirstName; QString MiddleName; QString LastName; public: void Serialize(QIODevice& file); void Deserialize(QIODevice& file); };
  • 44. http://www.slideshare.net/IgorShkulipa 44 Пример. Сериализующий метод void FullName::Serialize(QIODevice &file) { QString serial; QXmlStreamWriter stream(&serial); stream.setAutoFormatting(true); stream.writeStartDocument(); stream.writeStartElement("fullName"); stream.writeAttribute("id", "1"); stream.writeTextElement("FirstName",this->FirstName); stream.writeTextElement("MiddleName",this->MiddleName); stream.writeTextElement("LastName",this->LastName); stream.writeEndElement(); stream.writeEndDocument(); file.open(QIODevice::WriteOnly); file.write(serial.toAscii()); file.close(); }
  • 45. http://www.slideshare.net/IgorShkulipa 45 Пример. Десериализующий метод void FullName::Deserialize(QIODevice &file) { file.open(QIODevice::ReadOnly); QXmlStreamReader stream(&file); while(!stream.atEnd()) { QXmlStreamReader::TokenType token=stream.readNext(); if (stream.isStartElement()) { if (stream.name()=="FirstName") { this->FirstName=stream.readElementText(); } if (stream.name()=="LastName") { this->LastName=stream.readElementText(); } if (stream.name()=="MiddleName") { this->MiddleName=stream.readElementText(); } } } file.close(); }
  • 46. http://www.slideshare.net/IgorShkulipa 46 Пример. Использование void MainWindow::on_pushButton_3_clicked() { FullName fullName; fullName.FirstName="Ivan"; fullName.LastName="Ivanov"; fullName.MiddleName="Ivanovich"; QFile out("D:afullName.xml"); fullName.Serialize(out); fullName.FirstName="Petr"; fullName.LastName="Petrov"; fullName.MiddleName="Petrovich"; QFile in("D:afullName.xml"); fullName.Deserialize(in); fullName.Serialize(in); }
  • 47. http://www.slideshare.net/IgorShkulipa 47 Лабораторная работа №6. XML Добавить к тетрису возможность сохранения текущего состояния игры в формате XML. Данные, которые необходимо сохранять для каждого пользователя: • проведенные игры с момента логина пользователя • дата/время, продолжительность игр • счет в каждой игре • если последняя игра не закончена, то ее текущее состояние