Книга: Программирование мобильных устройств на платформе .NET Compact Framework

Листинг 10.1. Использование XML DOM для сохранения данных в файле и их загрузки

Листинг 10.1. Использование XML DOM для сохранения данных в файле и их загрузки

Option Strict On
Option Compare Binary
Imports System
'---------------------------------------------
'Демонстрирует сохранение и загрузку файлов с
'использованием объектной модели документа XML
'---------------------------------------------
Public Class SaveAndLoadXML_UseDOM
 'XML-дескрипторы, которые мы будем использовать в нашем документе
 Const XML_ROOT_TAG As String = "AllMyData"
 Const XML_USERINFO_TAG As String = "UserInfo"
 Const XML_USERID_TAG As String = "UserID"
 Const XML_NAMEINFO_TAG As String = "Name"
 Const XML_FIRSTNAME _TAG As String = "FirstName"
 Const XML_LASTNAME_TAG As String = "LastName"
 '--------------------------------------------------------------
 'Загружает пользовательское состояние
 ' [in] fileName: Имя файла, используемого для сохранения данных
 ' [out] userId: Загруженный идентификатор пользователя
 ' [out] firstName: Загруженное имя пользователя
 ' [out] lastName: Загруженная фамилия пользователя
 '--------------------------------------------------------------
 Public Shared Sub XML_LoadUserInfo(ByVal fileName As String, _
  ByRef userId As Integer, ByRef firstName As String, _
  ByRef lastName As String)
 'Начинаем с нулевых значений
 userId = 0
 firstName = ""
 lastName = ""
 'Предполагаем, что данные еще не загружены
 Dim gotUserInfoData As Boolean = False
 Dim xmlDocument As System.Xml.XmlDocument = _
  New System.Xml.XmlDocument
 xmlDocument.Load(fileName)
 'Получить корневой узел
 Dim rootElement As System.Xml.XmlElement
 rootElement = _
  CType(xmlDocument.ChildNodes(0), System.Xml.XmlElement)
 'Убедиться в том, что корневой узел согласуется с ожидаемым текстом,
 'ибо противное означает, что мы имеем дело с каким-то другим XML-файлом
 If (rootElement.Name <> XML_ROOT_TAG) Then
  Throw New Exception("Тип корневого узла не совпадает с ожидаемым!")
 End If
 '-----------------------------------------------------------
 'Простой конечный автомат для итеративного обхода всех узлов
 '-----------------------------------------------------------
 Dim childOf_RootNode As System.Xml.XmlElement
 For Each childOf_RootNode In _
  rootElement.ChildNodes
  'Если это узел UserInfo, то мы хотим просмотреть его содержимое
  If (childOf_RootNode.Name = XML_USERINFO_TAG) Then
   gotUserInfoData = True
   'Пользовательские данные найдены
   '--------------------------------
   'Загрузить каждый из подэлементов
   '--------------------------------
   Dim child_UserDataNode As System.Xml.XmlElement
   For Each child_UserDataNode In _
    childOf_RootNode.ChildNodes
    'Идентификатор пользователя (UserID)
    If (child_UserDataNode.Name = XML_USERID_TAG) Then
     userId = CInt(child_UserDataNode.InnerText)
     'ФИО пользователя (UserName)
    ElseIf (child_UserDataNode.Name = XML_NAMEINFO_TAG) Then
     Dim child_Name As System.Xml.XmlElement
      For Each child_Name In child_UserDataNode.ChildNodes
      'Имя (FirstName)
      If (child_Name.Name = XML_FIRSTNAME_TAG) Then
       firstName = child_Name.InnerText
       'Фамилия (LastName)
      ElseIf (chi1d_Name.Name = XML_LASTNAME_TAG) Then
       lastName = child_Name.InnerText
      End If
     Next 'Конец цикла разбора UserName
    End If 'Конец оператора if, осуществляющего проверку UserName
   Next 'Конец цикла разбора UserInfo
  End If 'Конец оператора if, осуществляющего проверку UserInfo
 Next 'Конец цикла разбора корневого узла
 If (gotUserInfoData = False) Then
  Throw New Exception("Данные пользователя в XML-документе не найдены!")
 End If
End Sub
'--------------------------------------------------------------------
'Сохраняет пользовательское состояние
' [in] fileName: Имя файла, используемого для сохранения данных
' [in] userId: Идентификатор пользователя, который мы хотим сохранить
' [in] firstName: Имя пользователя, которое мы хотим сохранить
' [in] lastName: Фамилия пользователя, которую мы хотим сохранить
'--------------------------------------------------------------------
Public Shared Sub XML_SaveUserInfo(ByVal fileName As String, _
 ByVal userId As Integer, ByVal firstName As String, _
 ByVal lastName As String)
 Dim xmlDocument As System.Xml.XmlDocument = _
  New System.Xml.XmlDocument
 '-----------------------------------------
 'Добавить элемент документа высшего уровня
 '-----------------------------------------
 Dim rootNodeForDocument As System.Xml.XmlElement
 rootNodeForDocument = xmlDocument.CreateElement( _
  XML_ROO T_TAG)
 xmlDocument.AppendChild(rootNodeForDocument)
 '----------------------------------
 'Добавить данные в элемент UserInfo
 '----------------------------------
 Dim topNodeForUserData As System.Xml.XmlElement
 topNodeForUserData = xmlDocument.CreateElement( _
  XML_USERINFO_TAG)
 rootNodeForDocument.AppendChild(topNodeForUserData)
 '---------------------------------------
 'Добавить значение UserID в наш документ
 '---------------------------------------
 'Создать подузел для информации о пространстве имен
 Dim subNodeForUserID As System.Xml.XmlElement
 subNodeForUserID = _
  xmlDocument.CreateElement(XML_USERID_TAG)
 subNodeForUserID.InnerText = _
  System.Convert.ToString(userId)
 'Присоединить подузел UserID к узлу высшего уровня
 topNodeForUserData.AppendChild(subNodeForUserID)
 '---------------------------------------------
 'Добавить все значения NameInfo в наш документ
 '---------------------------------------------
 'Создать подузел для информации о пространстве имен
 Dim subNodeForNameInfo As System.Xml.XmlElement
 subNodeForNameInfo = xmlDocument.CreateElement( _
  XML_NAMEINFO_TAG)
 'Имя (FirstName)
 Dim subNodeFirstName As System.Xml.XmlElement
 subNodeFirstName = xmlDocument.CreateElement( _
  XML_FIRSTNAME TAG)
 subNodeFirstName.InnerText = firstName
 'Фамилия (LastName)
 Dim subNodeLastName As System.Xml.XmlElement
 subNodeLastName = xmlDocument.CreateElement( _
  XML_LASTNAME_TAG)
 subNodeLastName.InnerText = lastName
 'Присоединить подузлы имени и фамилии к родительскому узлу
 'NameInfo
 subNodeForNameInfo.AppendChild(subNodeFirstName)
 subNodeForNameInfo.AppendChild(subNodeLastName)
 'Присоединить подузел NameInfo (вместе с его дочерними узлами)
 'к узлу высшего уровня
 topNodeForUserData.AppendChild(subNodeForNameInfo)
 '------------------
 'Сохранить документ
 '------------------
 Try
  xmlDocument.Save(fileName)
 Catch ex As System.Exception
  MsgBox( _
   "Ошибка при сохранении XML-документа - " + ex.Message)
 End Try
End Sub 'Конец функции
End Class 'Конец класса

Оглавление книги


Генерация: 0.048. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз