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.
Листинг 6.8
Private Sub Data_Load(ByVal MyDate As String)
\'Открываем файл, для это сначала получаем полный путь каталога,
\'в котором расположена программа в строковую переменную dirStr
dirStr = IO.Path.GetDirectoryName_
(Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase.ToString)
\'Создаем экземпляр объекта XmlTextReader
Dim xmlrdrMy As New Xml.XmlTextReader(dirStr + «\2005.xml»)
Dim MyCount, MyIndex As Integer
Dim lvItem As ListViewItem
\'Не реагируем на пробелы и управляющие символы
xmlrdrMy.WhitespaceHandling = xmlrdrMy.WhitespaceHandling.None
\'Переходим к содержимому, пропуская заголовочную часть
xmlrdrMy.MoveToContent()
\'В цикле считываем значения из файла, добавляем новую строку в ListView
\'для каждого тега Index и копируем значения атрибутов тега Index в
\'соответствующие поля записи ListView
ListView1.Items.Clear()
ListView1.Refresh()
While Not xmlrdrMy.EOF
If xmlrdrMy.Name = «Data» Then
If xmlrdrMy.GetAttribute(«value») = MyDate Then
MyIndex = CInt(xmlrdrMy.GetAttribute(«Cnt»))
For MyCount = 0 To MyIndex – 1
xmlrdrMy.Read()
lvItem = New ListViewItem(xmlrdrMy.GetAttribute(«Category»))
ListView1.Items.Add(lvItem)
ListView1.Items.Item(MyCount). SubItems.Add_
(xmlrdrMy.GetAttribute(«StartOf»))
ListView1.Items.Item(MyCount). SubItems.Add(xmlrdrMy.GetAttribute(«EndOf»))
ListView1.Items.Item(MyCount). SubItems.Add(xmlrdrMy.GetAttribute(«Note»))
Next
End If
End If
\'Считываем следующий элемент из файла XML
xmlrdrMy.Read()
End While
\'Закрываем файл
xmlrdrMy.Close()
End Sub
В этом случае мы воспользовались классом XmlTextReader для считывания информации из файла. Класс XmlTextReader также позволяет разбирать содержимое XML-документа, но он не создает копию файла в памяти, а считывает его в один проход элемент за элементом. Переход к следующему элементу осуществляется вызовом метода Read().
20. Теперь нужно создать процедуру сохранения данных текущего дня в файл. Эта процедура должна запускаться при переходе от одной даты к другой, а также в момент закрытия приложения. Ее код приведен в листинге 6.9.
Листинг 6.9
Private Sub Data_Save(ByVal MyDate As String)
Dim MyCount, MyIndex As Integer
\'Создаем объект XmlDocument
Dim myxml As New Xml.XmlDocument
dirStr = IO.Path.GetDirectoryName_
(Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase.ToString)
\'Загружаем файл в объект XmlDocument
myxml.Load(dirStr + «\2005.xml»)
\'Перебираем все узлы уровня Data и находим сохраняемую дату
For MyCount = 0 To myxml.ChildNodes(1). ChildNodes.Count – 1
If myxml.ChildNodes(1). ChildNodes(MyCount). Attributes(0). InnerText = MyDate Then
\'Удаляем все содержимое этого узла
myxml.ChildNodes(1). ChildNodes(MyCount). RemoveAll()
Читать дальше
Конец ознакомительного отрывка
Купить книгу