VB.net - XML
(создание, поиск, редактирование)
В этой статье я расскажу о работе с файлами XML на VB.net.
- - -
Для хранения настроек программы мы можем использовать реестр, обычные текстовые файлы или файлы xml.
XML (англ. eXtensible Markup Language) расширяемый язык разметки
XML это специальный расширяемый язык программирования для разметки. Поэтому в файлах XML используются теги которые определяют атрибуты объектов. По внешнему виду данный язык очень сильно напоминает обычный язык HTML. Однако отличием XML является возможность пользователей задавать свои теги и использовать их в дальнейшем.
Что представляет из себя формат XML
Структура файла такова:
версия и язык файла - обязательная составляющая.
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
корневое имя содержимого файла - в данном примере Table,
- <Product> - категория отдельных элементов
- <Product_id>, <Product_name>, <Product_price> - атрибуты элементов
Ваш файл может содержать совершенно другие категории и быть абсолютно не похожим на этот пример. Однако, его структура остается неизменной.
<кодировка>
<ROOT>
<element>
<atrib> a1 </atrib>
<atrib> a2</atrib>
</element>
<element>
<atrib> b1 </atrib>
<atrib> b2 </atrib>
</element>
</ROOT>
Создание xml файла
Как мы видим, такой формат файла можно использовать как базу данных. И для начала мы программно создадим XML файл.
На форму помещаем кнопку - меняем ей имя и текст (cmdNew и создать)
В код мы записываем следующее
' Процедура записи позиции
Private Sub addProduct(ByVal pID As String, ByVal pName As String, ByVal pPrice As String, _
ByVal writer As Xml.XmlTextWriter)
writer.WriteStartElement("Product")
' Запись открывающего тега
writer.WriteStartElement("Product_id")
' Запись обычных тексовых данных в качестве содержимого тега
writer.WriteString(pID)
' Запись закрывающего тега
writer.WriteEndElement()
writer.WriteStartElement("Product_name")
writer.WriteString(pName)
writer.WriteEndElement()
writer.WriteStartElement("Product_price")
writer.WriteString(pPrice)
writer.WriteEndElement()
writer.WriteEndElement()
End Sub
Это необходимо для упрощения записи каждого элемента. А ниже пишем подпрограмму для записи конкретных значений в новый файл. В нашем случае это будет 3 продукта, со своим номером и ценой.
'новый XML
Sub newFile()
' Создаем объект для записи XML-данных
Dim Writer As New Xml.XmlTextWriter("Test.xml", System.Text.Encoding.UTF8)
' Записываем объявление версии XML
Writer.WriteStartDocument(True)
' Указываем, что XML-документ должен быть отформатирован
Writer.Formatting = Xml.Formatting.Indented
' Задаем 2 пробела для выделения вложенных данных
Writer.Indentation = 2
' Записываем открывающий тег
Writer.WriteStartElement("Table")
' Вызываем процедуру записи позиции
addProduct(1, "Product 1", "1000", Writer)
addProduct(2, "Product 2", "2000", Writer)
addProduct(3, "Product 3", "3000", Writer)
' Закрываем тег
Writer.WriteEndElement()
' Заканчиваем запись (закрываем все не закрытые элементы)
Writer.WriteEndDocument()
' Закрываем файл
Writer.Close()
End Sub
Запускаем программу и создаем файл.
Общее количество элементов файла XML
Сейчас у нас создан маленький файл, и количество элементов легко можно посчитать. А если у вас огромная база, не будем же мы каждый раз открывать файл и смотреть на последнюю позицию. По этому мы создадим отдельную процедуру для нахождения максимального ID.
На форму помещаем еще одну кнопку - меняем имя и текст (cmdMax - max) и в ее код записываем подпрограмму maxIDxml()
Sub maxIDxml()
'получение последнего (наибольшего) номерa ID
Dim fileName As String = "Test.xml"
'загрузка документа
Dim xdoc As XDocument = XDocument.Load(fileName)
Dim maxId = 0
For Each xe As XElement In xdoc.Element("Table").Elements("Product")
If xe.Element("Product_id").Value > maxId Then
maxId += 1
End If
Next
'вывод значения в имя формы
Me.Text = Str(maxId)
End Sub
Общее количество элементов (или наибольшее ID) будет выведено в имя формы.
Поиск значений в XML файле
Естественно, используя XML как базу данных, нам понадобится считывать некоторые значения.
Для этого нам понадобится поиск. Помещаем на форму еще одну кнопку и текстовое поле (cmdSearch - Поиск).
В качестве примера - нам понадобится найти товар с ID = 2 и вывести результат в текстовое поле.
Private Sub cmdSearch_Click(sender As Object, e As EventArgs) Handles cmdSearch.Click
Dim fileName As String = "Test.xml"
'загрузка документа
Dim xdoc As XDocument = XDocument.Load(fileName)
rtxOtvet.Text = ""
For Each xe As XElement In xdoc.Element("Table").Elements("Product")
If xe.Element("Product_id").Value = 2 Then
rtxOtvet.Text += xe.Elements("Product_id").Value + " ) "
rtxOtvet.Text += xe.Elements("Product_name").Value + " ранг "
rtxOtvet.Text += xe.Elements("Product_price").Value + vbCrLf
End If
Next
End Sub
Если хотите сделать поиск любой записи можно воспользоваться нумератором (NumericUpDown1)- минимальное значение которого 0, а максимальное - общее количество элементов
Помещаем нумератор на форму.
Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
element1()
End Sub
Sub element1()
Dim nnn = NumericUpDown1.Value
maxIDxml()
Dim maxId_ = Val(Me.Text)
NumericUpDown1.Maximum = maxId_
Dim fileName As String = "Test.xml"
Dim xdoc As XDocument = XDocument.Load(fileName)
rtxOtvet.Text = ""
For Each xe As XElement In xdoc.Element("Table").Elements("Product")
If xe.Element("Product_id").Value = nnn Then
rtxOtvet.Text += xe.Elements("Product_id").Value + " ) "
rtxOtvet.Text += xe.Elements("Product_name").Value + " ранг "
rtxOtvet.Text += xe.Elements("Product_price").Value + vbCrLf
NumRang.Value = xe.Elements("Product_price").Value
End If
Next
End Sub
Изменение значений в XML файле
После того как мы нашли запись может потребоваться изменить ее. Допустим в нашей базе Product_price означает ранг товара - и он измеряется от -1 до 5. Добавим на форму еще 1 нумератор (NumRang)
Private Sub NumRang_ValueChanged(sender As Object, e As EventArgs) Handles NumRang.ValueChanged
Dim nnn = NumericUpDown1.Value
Dim fileName As String = "Test.xml"
Dim xdoc As XDocument = XDocument.Load(fileName)
For Each xe As XElement In xdoc.Element("Table").Elements("Product")
If xe.Element("Product_id").Value = nnn Then
xe.Elements("Product_price").Value = NumRang.Value
xdoc.Save(fileName)
End If
Next
element1()
End Sub
Теперь, выбрав товар, мы можем менять его ранг ( в нашем примере ранг от -1 до 5). Сразу после смены ранга - он сохраняется в файл.
***
В этой статье мы научились создавать xml файл, узнавать общее количество элементов в нем, искать в файле, а так же менять значения.
Смотреть видео
В начало
|