'SaveAndLoadXML_UseReaderWriter.XML_SaveUserInfo(FILENAME, _
' 18, "Ivo", "Salmre")
Dim userID As Integer
Dim firstName As String
Dim lastName As String
'Загрузить, используя XML DOM
SaveAndLoadXML_UseDOM.XML_LoadUserInfo(FILENAME, userID, _
firstName, lastName)
'Загрузить, используя объект однонаправленного чтения XMLReader
'SaveAndLoadXML_UseReaderWriter.XML_LoadUserInfo(FILENAME, _
' userID, firstName, lastName)
MsgBox("Готово! " + _
userID.ToString() + ", " + lastName + ", " + firstName)
End Sub
Листинг 10.3. Использование однонаправленного чтения/записи XML-данных для загрузки XML-документа из файла и его сохраненияOption Strict On
Option Compare Binary
Imports System
Public Class SaveAndLoadXML UseReaderWriter
'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"
'Набор состояний, отслеживаемых по мере чтения данных
Private Enum ReadLocation
inAllMyData
inUserInfo
inUserID
inName
inFirstName
inLastName
End Enum
'--------------------------------------------------------------------
'Сохраняет пользовательское состояние
' [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 xmlTextWriter As System.Xml.XmlTextWriter
xmlTextWriter = New System.Xml.XmlTextWriter(fileName, _
System.Text.Encoding.Default)
'Записать содержимое документа!
'<Root>
xmlTextWriter.WriteStartElement(XML_ROOT_TAG)
'<Root>
xmlTextWriter.WriteStartElement(XML_USERINFO_TAG)
'<Root><UserID>
'<Root><UserInfo>
xmlTextWriter.WriteStartElement(XML_NAMEINFO_TAG)
'<Root><UserInfo><Name>
xmlTextWriter.WriteStartElement(XML_FIRSTNAME_TAG)
'<Root><UserInfo><Name><FirstName>
xmlTextWriter.WriteString(firstName) 'Запись значения
xmlTextWriter.WriteEndElement() 'Закрыть дескриптор имени
'<Root><UserInfo><Name>
xmlTextWriter.WriteStartElement(XML_LASTNAME_TAG)
'<Root><UserInfo><Name><LastName>
xmlTextWriter.WriteString(lastName) 'Запись значения
xmlTextWriter.WriteEndElement() 'Закрыть дескриптор фамилии
'<Root><UserInfo><Name>
xmlTextWriter.WriteEndElement() 'Закрыть дескриптор ФИО
'<Root><UserInfo>
'<Root><UserInfo>
xmlTextWriter.WriteStartElement(XML_USERID_TAG)
'<Root><UserInfo><UserID>
'Запись значения
xmlTextWriter.WriteString(userId.ToString())
xmlTextWriter.WriteEndElement() 'Закрыть дескриптор UserID
'<Root><UserInfo>
xmlTextWriter.WriteEndElement()
'Закрыть дескриптор UserInfo
'<Root>
xmlTextWriter.WriteEndElement() 'Закрыть дескриптор документа
xmlTextWriter.Close()
End Sub
'--------------------------------------------------------------
'Загружает пользовательское состояние
' [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)
Dim currentReadLocation As ReadLocation
'Начинаем с нулевых значении
userId = 0
firstName = ""
lastName = ""
Dim xmlReader As System.Xml.XmlTextReader = _
New System.Xml.XmlTextReader(fileName)
xmlReader.WhitespaceHandling = _
System.Xml.WhitespaceHandling.None
Dim readSuccess As Boolean
readSuccess = xmlReader.Read()
If (readSuccess = False) Then
Throw New System.Exception("Отсутствуют XML-данные для чтения!")
End If
'Убедиться в том, что мы распознали корневой дескриптор
If (xmlReader.Name <> XML_ROOT_TAG) Then
Throw New System.Exception( _
"Корневой дескриптор отличается от ожидаемого!")
End If
'Отметить текущее местоположение в документе
currentReadLocation = ReadLocation.inAllMyData
'------------------------------------------------------
'Цикл прохождения документа и чтение необходимых данных
'------------------------------------------------------
While (readSuccess)
Select Case (xmlReader.NodeType)
'Вызывается при входе в новый элемент
Case System.Xml.XmlNodeType.Element
Dim nodeName As String = xmlReader.Name
LoadHelper_NewElementEncountered(nodeName, _
currentReadLocation)
'--------------------------------------------------
'Здесь мы можем извлечь некоторый фактический текст
'и получить данные, которые пытаемся загрузить
'--------------------------------------------------
Case System.Xml.XmlNodeType.Text