Создание XML-файлов с помощью XmlTextWriter. Запись элементов и их текстового содержимого. Запись атрибутов и их текстового содержимого. Форматирование.
XML-файлы в настоящее время используются в основном для обмена данными между приложениями, а создавать их в Visual Basic проще всего с помощью XmlTextWriter. У меня XmlTextWriter применяется в коде конвертера, преобразующего информацию из EXCEL-файлов поставщиков пива в в XML-файлы для загрузки в программу «Декларант-Алко». Далее простые примеры, как создавать XML-файлы с помощью XmlTextWriter, добавлять элементы, атрибуты и их текстовое содержимое.
Пример 1
Создание Xml-файла, запись элементов и их текстового содержимого
Создадим Xml-файл и запишем в него информацию из таблицы «Работники» следующим образом: имя таблицы как элемент первого уровня, наименование должности работника как элемент второго уровня, а табличные значения ФИО как текстовое содержимое элемента второго уровня:
Работники
Должность | ФИО |
---|---|
Дворник | Иванов И.И. |
Инженер | Петров П.П. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
'Создаем новый экземпляр XmlTextWriter с указанием полного имени файла и кодировки, 'файл с таким именем будет создан, а если он существует, то перезаписан Dim myWriter = New Xml.XmlTextWriter("D:\test1.xml", System.Text.Encoding.UTF8) With myWriter 'Записываем объявление XML с номером версии 1.0 .WriteStartDocument() 'Записываем открывающий тег первого элемента .WriteStartElement("Работники") 'Записываем открывающий тег первого вложенного элемента .WriteStartElement("Дворник") 'Записываем текстовое содержимое элемента .WriteString("Иванов И.И.") 'Записываем закрывающий тег первого вложенного элемента .WriteEndElement() 'Записываем открывающий тег второго вложенного элемента .WriteStartElement("Инженер") 'Записываем текстовое содержимое элемента .WriteString("Петров П.П.") 'Закрывающий тег второго вложенного элемента '.WriteEndElement() 'Закрывающий тег первого элемента '.WriteEndElement() 'Закрываем все незакрытые элементы и атрибуты .WriteEndDocument() 'Закрываем экземпляр XmlTextWriter .Close() 'Если в этой же процедуре создается еще Xml-файл, то уже объявленной 'переменной myWriter присваивается новый экземпляр XmlTextWriter, например: 'MyWriter = New Xml.XmlTextWriter("D:\test2.xml", System.Text.Encoding.UTF8) End With MsgBox("Процесс записи завершен!") |
Две команды «.WriteEndElement()» закомментированы, так как их выполняет метод «.WriteEndDocument()», который закрывает все незакрытые элементы и атрибуты (стоит отметить, если не записать закрывающий тег первого вложенного элемента, то второй вложенный элемент откроется как элемент третьего уровня).
Результат выполнения кода примера 1:
1 2 3 4 5 |
‹?xml version="1.0" encoding="UTF-8"?› ‹Работники› ‹Дворник›Иванов И.И.‹/Дворник› ‹Инженер›Петров П.П.‹/Инженер› ‹/Работники› |
Пример 2
Создание Xml-файла, запись элементов, атрибутов и их текстового содержимого
Создадим Xml-файл и запишем имя таблицы как элемент первого уровня, наименование должности работника как элемент второго уровня, названия граф («Фамилия», «Имя» и «Отчество») как атрибуты элемента «Наименование должности», а табличные значения ФИО как текстовое содержимое атрибутов:
Работники
Должность | Фамилия | Имя | Отчество |
---|---|---|---|
Дворник | Иванов | Иван | Иванович |
Инженер | Петров | Петр | Петрович |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Dim myWriter = New Xml.XmlTextWriter("D:\test2.xml", System.Text.Encoding.UTF8) With myWriter .WriteStartDocument() .WriteStartElement("Работники") 'Записываем открывающий тег первого вложенного элемента .WriteStartElement("Дворник") 'Записываем первый атрибут первого вложенного элемента .WriteStartAttribute("Фамилия") 'Записываем текстовое содержимое атрибута .WriteString("Иванов") 'Записываем второй атрибут первого вложенного элемента .WriteStartAttribute("Имя") 'Записываем текстовое содержимое атрибута .WriteString("Иван") 'Записываем третий атрибут первого вложенного элемента .WriteStartAttribute("Отчество") 'Записываем текстовое содержимое атрибута .WriteString("Иванович") 'Записываем закрывающий тег первого вложенного элемента .WriteEndElement() 'Записываем открывающий тег второго вложенного элемента .WriteStartElement("Инженер") 'Записываем первый атрибут второго вложенного элемента .WriteStartAttribute("Фамилия") 'Записываем текстовое содержимое атрибута .WriteString("Петров") 'Записываем второй атрибут второго вложенного элемента .WriteStartAttribute("Имя") 'Записываем текстовое содержимое атрибута .WriteString("Петр") 'Записываем третий атрибут второго вложенного элемента .WriteStartAttribute("Отчество") 'Записываем текстовое содержимое атрибута .WriteString("Петрович") 'Закрываем все незакрытые элементы и атрибуты .WriteEndDocument() .Close() End With MsgBox("Процесс записи завершен!") |
Результат выполнения кода примера 2:
1 2 3 4 5 |
‹?xml version="1.0" encoding="UTF-8"?› ‹Работники› ‹Дворник Фамилия="Иванов" Имя="Иван" Отчество="Иванович"/› ‹Инженер Фамилия="Петров" Имя="Петр" Отчество="Петрович"/› ‹/Работники› |
Пример 3
Запишем имя таблицы как элемент первого уровня, слово «Работник» как элемент второго уровня, «id» и «ФИО» как атрибуты элемента «Работник», «Год_рождения», «Паспорт» и «Должность» как вложенные элементы третьего уровня, «серия» и «номер» как атрибуты элемента «Паспорт», а также применим форматирование к документу XML:
Работники
Id работника |
ФИО | Год_ рождения |
Паспорт | Должность | |
---|---|---|---|---|---|
серия | номер | ||||
1 | Иванов И.И. | 1956 | 22 22 | 222222 | дворник |
2 | Петров П.П. | 1967 | 33 33 | 333333 | инженер |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Dim myWriter = New Xml.XmlTextWriter("D:\test3.xml", System.Text.Encoding.UTF8) With myWriter .WriteStartDocument() 'Указываем, что XML-документ должен быть отформатирован .Formatting = Xml.Formatting.Indented 'Задаем 4 пробела для выделения вложенных данных .Indentation = 4 .WriteStartElement("Работники") .WriteStartElement("Работник") .WriteStartAttribute("id") .WriteString("1") .WriteStartAttribute("ФИО") .WriteString("Иванов И.И.") .WriteStartElement("Год_рождения") .WriteString("1956") .WriteEndElement() .WriteStartElement("Паспорт") .WriteStartAttribute("серия") .WriteString("22 22") .WriteStartAttribute("номер") .WriteString("222222") .WriteEndElement() .WriteStartElement("Должность") .WriteString("дворник") .WriteEndElement() .WriteEndElement() .WriteStartElement("Работник") .WriteStartAttribute("id") .WriteString("2") .WriteStartAttribute("ФИО") .WriteString("Петров П.П.") .WriteStartElement("Год_рождения") .WriteString("1967") .WriteEndElement() .WriteStartElement("Паспорт") .WriteStartAttribute("серия") .WriteString("33 33") .WriteStartAttribute("номер") .WriteString("333333") .WriteEndElement() .WriteStartElement("Должность") .WriteString("инженер") .WriteEndDocument() .Close() End With MsgBox("Процесс записи завершен!") |
Результат выполнения кода примера 3:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
‹?xml version="1.0" encoding="UTF-8"?› ‹Работники› ‹Работник id="1" ФИО="Иванов И.И."› ‹Год_рождения›1956‹/Год_рождения› ‹Паспорт серия="22 22" номер="222222"/› ‹Должность›дворник‹/Должность› ‹/Работник› ‹Работник id="2" ФИО="Петров П.П."› ‹Год_рождения›1967‹/Год_рождения› ‹Паспорт серия="33 33" номер="333333"/› ‹Должность›инженер‹/Должность› ‹/Работник› ‹/Работники› |
Примечания
1. При открытии XML-файлов из примеров 1 и 2 в текстовом редакторе, их код будет расположен в одной строке, а отформатированный код из примера 3 отобразится в текстовом редакторе так же, как и в браузере.
2. Атрибуты, в зависимости от программы, могут отображаться не в том порядке, как записаны в исходном XML-файле. При тестировании в Google Chrome, Notepad++ последовательность оказалась та же, что и в примерах, а в Internet Explorer 10 атрибуты отобразились в обратном порядке.