KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Владимир Волков - Программирование для карманных компьютеров

Владимир Волков - Программирование для карманных компьютеров

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Владимир Волков, "Программирование для карманных компьютеров" бесплатно, без регистрации.
Перейти на страницу:

Код простейшего XML-файла показан в листинге 6.4.

Листинг 6.4

<?xml version="1.0" encoding="windows-1251"?>

<Y2005>

<Date>

<Index value = "0"/>

</Date>

<Date>

<Index value = "1"/>

</Date>

<Date>

<Index>2

</Index>

</Date>

</Y2005>

Первая строка является описанием XML-документа. Она позволяет указывать версию XML и кодировку, в которой записан документ. Затем следует тег с именем Y2005. Этот тег состоит из открывающей (<Y2005>) и закрывающей (</Y2005>) частей. Внутри тега Y2005 расположены теги с именем Date. Все три тега Date не пустые, поэтому тоже имеют открывающую и закрывающую часть. Внутри тегов Date вложены теги Index. Первые два тега Index пустые, они состоят из одной части, которая одновременно открывает и закрывает этот тег. Внутри тега Index в первых двух случаях записано значение value. Значения, записанные внутри скобок тега, называются атрибутами. Любой тег может иметь любое количество атрибутов, но только одно значение. Значение записывается между открывающей и закрывающей частью тега.

Любой XML-документ должен начинаться с одного тега, который называется корневым тегом. В нашем случае корневым тегом является тег Y2005.

Что нам надо хранить в нашем XML-документе? Это должна быть информация о дате, для которой мы выполняем хронометраж, о категории работы, о времени начала работы, о времени ее окончания и примечания к каждой записи, если они необходимы. Структура нашего XML-файла приведена в листинге 6.5.

Листинг 6.5

Заголовочная часть:

<?xml version="1.0" encoding="windows-1251"?>

Корневой тег:

<Y2005>

Столько тегов Date, сколько дней мы будем контролировать:

<Date value = В«20.08.2005В» Cnt = "1">

Столько тегов Index, сколько отрезков времени мы учтем за день:

<Index Category="Work1" StartOf= В«00.00В» EndOf = В«00.20В» Note=""/>

<Index Category="Misc" StartOf= В«00.20В» EndOf = В«00.40В» Note=""/>

</Date>

…

</Y2005>

В каждом теге Date есть два атрибута. Атрибут value несет в себе дату, а Cnt – количество записей за день. В каждом теге Index есть четыре атрибута. В атрибуте Category указывается категория занятия, в атрибуте StartOf – время начала, в атрибуте EndOf – время окончания, а атрибут Note предназначен для хранения примечания.

Файл с такой структурой должен быть создан при первом запуске программы, прочитан и отредактирован при каждом последующем запуске.

Упражнение 6.2 (продолжение)

17. При запуске нашего приложения необходимо проверить, существует ли файл 2005.xml, в котором записаны результаты контроля времени, и файл Category.xml, в котором содержится список категорий. Если данные файлы не существуют, то их надо создать. Если файлы все еще существуют, то их нужно загрузить. Эти операции будут проводиться в обработчике события загрузки основной формы приложения. Но перед этим в класс формы нужно добавить две переменные. В окне Solution Explorer нужно выделить файл Form1.vb и из контекстного меню выполнить для этого файла команду View Code. Затем в самое начало кода нужно добавить строки, приведенные в листинге 6.6.

Листинг 6.6

Public Class Form1

Inherits System.Windows.Forms.Form

Friend WithEvents ListView1 As System.Windows.Forms.ListView

Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

'Добавленные переменные

Dim D As DateTime

Dim dirStr As String

18. Теперь можно создать процедуру обработчика события загрузки формы, код которой приведен в листинге 6.7. Листинг 6.7

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

Handles MyBase.Load

'Если файл с данными отсутствует в текущем каталоге, мы его создаем, для

'этого сначала получаем полный путь каталога, в котором расположена

'программа, в строковую переменную dirStr

dirStr = IO.Path.GetDirectoryName_

(Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase.ToString)

'Проверяем, есть ли файл c заданным именем по полученному пути

If Not System.IO.File.Exists(dirStr + В«2005.xmlВ») Then

'Если файла нет – создаем его

'Создаем экземпляр XmlDocument

Dim myxmlDoc As New Xml.XmlDocument

'Создаем корневой тег и добавляем его к документу

Dim oROOT As Xml.XmlElement = myxmlDoc.CreateElement(В«Y2005В»)

myxmlDoc.AppendChild(oROOT)

'Получаем текущую дату в переменную myDate

Dim myDate As Date = Date.Now

myDate = DateAdd(DateInterval.Day, – 1, myDate)

'Заполняем файл тегами Data от сегодняшнего дня до конца текущего года

While Not myDate.ToShortDateString = В«31.12.2005В»

myDate = DateAdd(DateInterval.Day, 1, myDate)

Dim oData As Xml.XmlElement = myxmlDoc.CreateElement(В«DataВ»)

oROOT.AppendChild(oData)

Dim oValue As Xml.XmlAttribute = _ myxmlDoc.CreateAttribute(В«valueВ»)

Dim oIndex As Xml.XmlAttribute = _ myxmlDoc.CreateAttribute(В«CntВ»)

oValue.InnerText = myDate.ToShortDateString

oIndex.InnerText = В«-1В»

oData.SetAttributeNode(oValue)

oData.SetAttributeNode(oIndex)

End While

'Создаем заголовочную часть XML файла

Dim myPI As Xml.XmlProcessingInstruction = _

myxmlDoc.CreateProcessingInstruction_

(В«xmlВ», "version= 1.0 encoding='windows-1251 ")

myxmlDoc.InsertBefore(myPI, myxmlDoc.ChildNodes(0))

'Сохраняем созданный документ

myxmlDoc.Save(dirStr + В«2005.xmlВ»)

End If

'Если файл со списком категорий отсутствует в текущем каталоге, мы его

'создаем с пятью категориями Work1, Work2, Work3, Misc, Trash

If Not System.IO.File.Exists(dirStr + В«Category.xmlВ») Then

If Not System.IO.File.Exists(dirStr + В«Category.xmlВ») Then

Dim myxmlDoc As New Xml.XmlDocument

Dim oROOT As Xml.XmlElement = myxmlDoc.CreateElement(В«CategotyВ»)

myxmlDoc.AppendChild(oROOT)

Dim oWork1 As Xml.XmlElement = myxmlDoc.CreateElement(В«Work1В»)

oROOT.AppendChild(oWork1)

Dim oWork2 As Xml.XmlElement = myxmlDoc.CreateElement(В«Work2В»)

oROOT.AppendChild(oWork2)

Dim oWork3 As Xml.XmlElement = myxmlDoc.CreateElement(В«Work3В»)

oROOT.AppendChild(oWork3)

Dim oMisc As Xml.XmlElement = myxmlDoc.CreateElement(В«MiscВ»)

oROOT.AppendChild(oMisc)

Dim oTrash As Xml.XmlElement = myxmlDoc.CreateElement(В«TrashВ»)

oROOT.AppendChild(oTrash)

Dim myPI As Xml.XmlProcessingInstruction = _

myxmlDoc.CreateProcessingInstruction_

(В«xmlВ», "version= 1.0 encoding='windows-1251 ")

myxmlDoc.InsertBefore(myPI, myxmlDoc.ChildNodes(0))

myxmlDoc.Save(dirStr + В«Category.xmlВ»)

End If

D = DateTime.Now

Label1.Text = System.DateTime.Today.ToShortDateString

'Вызываем процедуру загрузки данных в ListView

Data_Load(System.DateTime.Today.ToShortDateString)

End Sub

Чтобы создать и сохранить новый XML-документ, мы воспользовались классом XMLDocument, который позволяет представить существующий XML-документ в виде объекта с набором полей и методов для манипуляции этими полями. Он позволяет создавать и удалять элементы XML как по имени, так и по индексу, осуществлять поиск нужного элемента, заменять или дублировать элементы, сохранять измененный документ. Единственным недостатком этого класса является то, что документ полностью загружается в создаваемый объект. Поскольку на Pocket PC и файловая система, и оперативная память программы физически являются одним и тем же устройством, то просто происходит дублирование информации на время работы с документом.

19. Процедура загрузки данных для текущего дня в компонент ListView приведена в листинге 6.8.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*