Чтение и запись XML в языке 1С 8.3, 8.2 (в примерах)
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
2017-12-18T22:33:34+00:00<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.xml, который используется в примерах ниже.
/// Как прочитать файл в формате XML через DOM /// в 1с 8.3, 8.2 &НаСервере Процедура ПрочитатьФайлXMLЧерезDOM(ПутьКФайлу) // Разбор документа через DOM (document object model) // https://ru.wikipedia.org/wiki/Document_Object_Model // Разбираем файл test.xml, ссылка на его скачивание выше. Парсер = Новый ЧтениеXML; Парсер.ОткрытьФайл(ПутьКФайлу); Построитель = Новый ПостроительDOM; Документ = Построитель.Прочитать(Парсер); Для Каждого Элемент0 Из Документ.ЭлементДокумента.ДочерниеУзлы Цикл Если Элемент0.ИмяУзла = "Страна" Тогда Страна = Элемент0; Название = Страна.Атрибуты.ПолучитьИменованныйЭлемент("Название"); Если Название <> Неопределено Тогда Сообщить("== " + Название.Значение + " =="); КонецЕсли; Численность = Страна.Атрибуты.ПолучитьИменованныйЭлемент("Численность"); Если Численность <> Неопределено Тогда Сообщить("Численность: " + Численность.Значение); КонецЕсли; Столица = Страна.Атрибуты.ПолучитьИменованныйЭлемент("Столица"); Если Столица <> Неопределено Тогда Сообщить("Столица: " + Столица.Значение); КонецЕсли; Для Каждого Элемент1 Из Страна.ДочерниеУзлы Цикл Если Элемент1.ИмяУзла = "ТрадиционныеБлюда" Тогда ТрадиционныеБлюда = Элемент1; Сообщить("Традиционные блюда:"); Для Каждого Элемент2 Из ТрадиционныеБлюда.ДочерниеУзлы Цикл Если Элемент2.ИмяУзла = "Блюдо" Тогда Блюдо = Элемент2; Название = Блюдо.Атрибуты.ПолучитьИменованныйЭлемент("Название"); Если Название <> Неопределено Тогда Сообщить(" " + Название.Значение); КонецЕсли; КонецЕсли; КонецЦикла; ИначеЕсли Элемент1.ИмяУзла = "ОбщееОписание" Тогда Сообщить("Общее описание:"); Сообщить(Элемент1.ТекстовоеСодержимое); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Парсер.Закрыть(); КонецПроцедуры /// Как прочитать файл в формате XML последовательно /// (способ 1) в 1с 8.3, 8.2 &НаСервере Процедура ПрочитатьФайлXMLПоследовательноСпособ1(ПутьКФайлу) // Этот способ подойдёт для очень больших файлов, // для которых модель DOM неприменима. // Способ 1. // Разбираем файл test.xml, ссылка на его скачивание выше. Парсер = Новый ЧтениеXML; Парсер.ОткрытьФайл(ПутьКФайлу); Пока Парсер.Прочитать() Цикл Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И Парсер.Имя = "Страна" Тогда Название = Парсер.ЗначениеАтрибута("Название"); Если Название <> Неопределено Тогда Сообщить("== " + Название + " =="); КонецЕсли; Численность = Парсер.ЗначениеАтрибута("Численность"); Если Численность <> Неопределено Тогда Сообщить("Численность: " + Численность); КонецЕсли; Столица = Парсер.ЗначениеАтрибута("Столица"); Если Столица <> Неопределено Тогда Сообщить("Столица: " + Столица); КонецЕсли; Пока Парсер.Прочитать() Цикл // <Страна> Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И Парсер.Имя = "ТрадиционныеБлюда" Тогда Сообщить("Традиционные блюда:"); Пока Парсер.Прочитать() Цикл // <ТрадиционныеБлюда> Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И Парсер.Имя = "Блюдо" Тогда Название = Парсер.ЗначениеАтрибута("Название"); Если Название <> Неопределено Тогда Сообщить(" " + Название); КонецЕсли; ИначеЕсли Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента И Парсер.Имя = "ТрадиционныеБлюда" Тогда Прервать; КонецЕсли; КонецЦикла; // </ТрадиционныеБлюда> ИначеЕсли Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента И Парсер.Имя = "ОбщееОписание" Тогда Парсер.Прочитать(); Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда Сообщить("Общее описание:"); Сообщить(Парсер.Значение); КонецЕсли; ИначеЕсли Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента И Парсер.Имя = "Страна" Тогда Прервать; КонецЕсли; КонецЦикла; // </Страна> КонецЕсли; КонецЦикла; Парсер.Закрыть(); КонецПроцедуры /// Как прочитать файл в формате XML последовательно /// (способ 2) в 1с 8.3, 8.2 &НаСервере Процедура ПрочитатьФайлXMLПоследовательноСпособ2(ПутьКФайлу) // Этот способ подойдёт для очень больших файлов, // для которых модель DOM неприменима. // Способ 2. // Разбираем файл test.xml, ссылка на его скачивание выше. Парсер = Новый ЧтениеXML; Парсер.ОткрытьФайл(ПутьКФайлу); СтекИмен = Новый СписокЗначений; Пока Парсер.Прочитать() Цикл Если Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда СтекИмен.Добавить(Парсер.Имя); ПолныйПуть = ПостроитьПуть(СтекИмен); Если ПолныйПуть = "/Страны/Страна" Тогда Название = Парсер.ЗначениеАтрибута("Название"); Если Название <> Неопределено Тогда Сообщить("== " + Название + " =="); КонецЕсли; Численность = Парсер.ЗначениеАтрибута("Численность"); Если Численность <> Неопределено Тогда Сообщить("Численность: " + Численность); КонецЕсли; Столица = Парсер.ЗначениеАтрибута("Столица"); Если Столица <> Неопределено Тогда Сообщить("Столица: " + Столица); КонецЕсли; ИначеЕсли ПолныйПуть = "/Страны/Страна/ТрадиционныеБлюда" Тогда Сообщить("Традиционные блюда:"); ИначеЕсли ПолныйПуть = "/Страны/Страна/ТрадиционныеБлюда/Блюдо" Тогда Название = Парсер.ЗначениеАтрибута("Название"); Если Название <> Неопределено Тогда Сообщить(" " + Название); КонецЕсли; ИначеЕсли ПолныйПуть = "/Страны/Страна/ОбщееОписание" Тогда Парсер.Прочитать(); Если Парсер.ТипУзла = ТипУзлаXML.Текст Тогда Сообщить("Общее описание:"); Сообщить(Парсер.Значение); КонецЕсли; КонецЕсли; ИначеЕсли Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда СтекИмен.Удалить(СтекИмен.Количество() - 1); КонецЕсли; КонецЦикла; Парсер.Закрыть(); КонецПроцедуры /// Как записать данные в файл формата XML в 1с 8.3, 8.2 &НаКлиенте Процедура ЗаписатьДанныеВФорматеXML(ПутьКФайлуДляЗаписи) // Предположим, что у нас есть данные о странах, // которые нужно записать во внешний файл в формате XML. Страны = СоздатьДанныеДляЗаписиВXML(); // И эти данные хранятся во списке значений Страны, // который нам вернула внутренняя процедура (определена // ниже). ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента("Страны"); Для Каждого Страна Из Страны Цикл ЗаписьXML.ЗаписатьНачалоЭлемента("Страна"); ЗаписьXML.ЗаписатьАтрибут("Название", Страна.Значение.Название); ЗаписьXML.ЗаписатьАтрибут("Численность", Страна.Значение.Численность); ЗаписьXML.ЗаписатьАтрибут("Столица", Страна.Значение.Столица); ЗаписьXML.ЗаписатьНачалоЭлемента("ТрадиционныеБлюда"); Для Каждого Блюдо Из Страна.Значение.ТрадиционныеБлюда Цикл ЗаписьXML.ЗаписатьНачалоЭлемента("Блюдо"); ЗаписьXML.ЗаписатьАтрибут("Название", Блюдо.Значение.Название); ЗаписьXML.ЗаписатьКонецЭлемента(); // Блюдо КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); // ТрадиционныеБлюда ЗаписьXML.ЗаписатьНачалоЭлемента("ОбщееОписание"); ЗаписьXML.ЗаписатьТекст(Страна.Значение.ОбщееОписание); ЗаписьXML.ЗаписатьКонецЭлемента(); // ОбщееОписание ЗаписьXML.ЗаписатьКонецЭлемента(); // Страна КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); // Страны ЗаписьXML.Закрыть(); КонецПроцедуры &НаКлиенте Функция СоздатьДанныеДляЗаписиВXML() Страны = Новый СписокЗначений; Россия = Новый Структура("Название, Численность, Столица, ТрадиционныеБлюда, ОбщееОписание"); Россия.Название = "Россия"; Россия.Численность = "144000000"; Россия.Столица = "Москва"; Россия.ТрадиционныеБлюда = Новый СписокЗначений; Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Щи")); Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Солянка")); Россия.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Рассольник")); Россия.ОбщееОписание = "Страна с очень" + Символы.ПС + "большой территорией"; Страны.Добавить(Россия); Китай = Новый Структура("Название, Численность, Столица, ТрадиционныеБлюда, ОбщееОписание"); Китай.Название = "Китай"; Китай.Численность = "1357000000"; Китай.Столица = "Пекин"; Китай.ТрадиционныеБлюда = Новый СписокЗначений; Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Свинина в кисло-сладком соусе")); Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Курица гунбао")); Китай.ТрадиционныеБлюда.Добавить(Новый Структура("Название", "Мапо тофу")); Китай.ОбщееОписание = "Страна с очень" + Символы.ПС + "большим населением."; Страны.Добавить(Китай); Возврат Страны; КонецФункции &НаСервере Функция ПостроитьПуть(СтекИмен) Путь = ""; Для Каждого Имя Из СтекИмен Цикл Путь = Путь + "/" + Имя; КонецЦикла; Возврат Путь; КонецФункции /// Скачать и выполнить эти примеры на компьютере |
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.xml, который используется в примерах ниже.
Чтение и запись XML в языке 1С 8.3, 8.2 (в примерах)
<<< XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент