Чтение файла xml

Работа с XML C# в примерах

Чтение файла xml

Давайте рассмотрим на практике использование популярного формата структурирования информации XML в языке программирования C#. Мы реализуем как чтение уже имеющихся данных, так и сохранение их в XML C#.

Что такое XML?

XML (eXtensible Markup Language) — это универсальный расширяемый язык для разметки информации. Он позволяет структурировать, хранить и передавать информацию в определенном формате.

Особенность данного языка заключается в том, что самоопределяемым, что позволяет самостоятельно расширять набор условных меток — тегов.

Используя их, можно формировать данные в виде древовидной структуры, когда одни элементы содержат в себе другие.

на группу  и Телеграм-канал. Там еще больше полезного контента для программистов.
А на -канале ты найдешь обучающие видео по программированию. Подписывайся!

Пример XML разметки

В качестве примера можно рассмотреть телефонную книгу, в которой хранятся такие данные как имя человека, номер телефона и заметка.

Саша 890953317 Не бери трубку! Дима 890512309 Босс Рита 890198735 Невероятная девчонка

Первым строкой в файле должен идти заголовок, который указывает какую версию использовать, а также кодировку текста.

Затем должен обязательно идти единственных корневой элемент, в который включены все остальные данные.

В дальнейшем все данные разбиваются на объекты, включающие другие объекты и так далее, в зависимости от структуры данных. Также у объекта могут быть указаны дополнительные свойства, они называются атрибуты.

Работа с XML на языке C#

Для взаимодействия с файлом в языке программирования C# имеется несколько отличных библиотек, но для начала мы рассмотрим одну из самых простых реализаций, расположенную в пространстве имен System.XML. Данная библиотека позволяет как читать, так и сохранять данные в файлы.

Реализуем две основные операции, это чтение данных из файла, и сохранение данных в файл. Рассмотрим основной метод приложения.

Program.cs

static void Main(string[] args){ // Устанавливаем кодировку консоли. // Нужно только если при использовании англоязычной Windows // на консоль вместо кириллицы выводятся знаки вопроса (??? ????? ??????) Console.OutputEncoding = Encoding.Unicode; // Читаем Xml файл. ReadXmlFile(“example.

xml”); // Ждем ввода пользователя. Console.ReadLine(); // Создаем структуру данных. var catalog = new Catalog() // Корневой элемент { Phones = new List() // Коллекция номеров телефонов. { new Phone() {Name = “Саша”, Number = 890953317, Remark = “Не бери трубку!”, Important = false}, // Запись номера телефона.

new Phone() {Name = “Дима”, Number = 890512309, Remark = “Босс”, Important = false}, new Phone() {Name = “Рита”, Number = 890198735, Remark = “Невероятная девчонка”, Important = true} } }; // Пишем в файл. WriteXmlFile(“result.xml”, catalog); // Сообщаем пользователю о завершении. Console.

WriteLine(“ОК”); Console.ReadLine();}

Чтение XML файла на языке C#

Возьмем в качестве исходного файла пример указанный выше, для простоты удалив комментарии.

Phone.cs

namespace XML{ /// /// Телефонный контакт. /// public class Phone { /// /// Имя. /// public string Name { get; set; } /// /// Телефонный номер. /// public int Number { get; set; } /// /// Заметка.

/// public string Remark { get; set; } /// /// Важный контакт. /// public bool Important { get; set; } /// /// Приведение объекта к строке. /// /// Имя.

public override string ToString() { return Name; } }}

Catalog.cs

using System.Collections.Generic; namespace XML{ /// /// Каталог телефонных номеров. /// public class Catalog { /// /// Список телефонных номеров. /// public List Phones { get; set; } = new List(); }}

Теперь реализуем метод формирования файла на основе имеющихся данных.

Заключение

Здесь рассмотрено элементарное взаимодействие с файлами. В дальнейшем мы обязательно вернемся к данной теме. Исходный код доступен в репозитории https://github.com/shwanoff/XML.

Также советую изучить статью Новинки C# 7.2. Span и Memory. А еще подписывайтесь на группу ВКонтакте, Telegram и -канал. Там еще больше полезного и интересного для программистов.

Разбор XML документа – почти все возможные способы

Чтение файла xml

При обмене данными, как бы он не производился  ( через файлы, через HTTP запросы или еще каким либо другим путем ) все равно основным форматом обмена является XML. В 1С существует несколько способов обработки XML  документов  –  какой из них выбрать по критерию логической простоты и быстродействия?  Для практической проверки различных методов был создан XML документ вида

Задачей всех проверяемых методов было получение из XML файла массива, состоящего из структур со свойствами Номер, Дата, Поставщик, Состав, причем свойство Состав само является массивом структур со свойствами Номенклатура и Количество.  

Первый метод – простое последовательное чтение XML.

Текущее положение в XML документе отслеживается в переменной  ТекущийПуть и при поступлении текстового узла на  основании этой переменной заполняются (или игнорируются) соответствующие данные 1С.

Конечно, не совсем корректно оценивать логическую сложность программы в строках исходного текста, но тем не менее это самый большой объем  из всех методов  – 64 строки. Что касается быстродействия (оно проверялось на компьютере памятью в 8 Гб и процессором Intel i7 2.

2 Ггц, было создано два файла один на 10 тысяч записей объемом 10 мегабайт, другой на 100 тысяч и 100 мегабайт соответственно) , то на файле 10 000 записей полная обработка заняла 30 секунд  и на файле в 100 мегабайт линейно увеличилась в 10 раз.

Второй метод – получение из XML файла документа DOM и последовательный перебор всех узлов полученного документа

Логически этот метод весьма незначительно проще прямого ЧтенияXML (57 строк кода против 62), а вот с быстродействие картина интересная: для файла в 10 тысяч записей быстродействие составило 12 секунд (быстрее более чем в два раза) ,  но для файла со 100 тысячами записей резко поднялась до 1000 секунд (медленнее более чем в три раза).

Третий метод подобен второму, но вместо последовательного перебора узлов применен отбор требуемых узлов в DOM документе  с помощью  выражений XPath .

Этот метод немного проще чем простой перебор узлов в DOM документе, но быстродействие … При 10 000 записей 69 секунд , а для 100 000 обработка длилась более часа, так и не завершилась, после чего была снята принудительно.

Очевидно метод с использованием DOM, в особенности при поиске узлов документа XPath выражениями, надо использовать только для небольших изменений DOM документа со сложной структурой узлов.

Все последующие методы используют для разбора XML документа фабрику XDTO.

Четвертый метод использует метод  ПрочитатьXML глобальной ФабрикиXDTO. При этом тип получаемого объекта не указывается, его определяет сам метод фабрики.

Тут есть маленькая тонкость – в случае, если тип получаемого объектаXDTO не указан, фабрика не всегда может самостоятельно определить что она получила одиночный объект или список из нескольких одинаковых объектов ( в нашем примере если ПриходныйОрдер в XML документе будет один фабрика посчитает что ПриходыXDTO.ПриходныйОрдер это одиночный объект а не список).

Данный метод не только заметно проще, чем все предыдущие, но и показывает отличное быстродействие  на 10 000 записях 4,6 секунды, а при 100 000 обработка длится 46 секунд. Что показывает линейную зависимость от объема обрабатываемого файла.

Пятый метод схож с предыдущим, но глобальной фабрике XDTO подается на вход не только сам XML документ, но и его тип. Этот тип берется из ветки конфигурации XDTO-пакеты.

(Если те кто передает вам XML данные хорошие люди, то они должны передать вам и XML схему данных – файл с расширением .

xsd  из которого вы и создаете в своей конфигурации  XDTO-пакет – команда импорт XML схемы …, если нет требуемый пакет обычно не сложно создать вручную, анализируя переданные XML данные).

Один нюанс – частенько XML данные передают без указания URI пространства имен ( атрибут  xmlns). Если это так, то необходимо самому добавить недостающий атрибут в XML данные, что и делают первые три оператора процедуры.

Метод замечательный, как по простоте создания, так и по быстродействию – 3,1 секунды на 10 000 записях.

И последний метод. Это скорее некоторая модификация пятого метода, но для условия, что не используется объект конфигурации XDTO-пакет, и фабрика XDTO создается на ходу из текстового описания XML схемы.

(Примечание 1-Конечно можно загнать схему в текстовый макет, и оттуда уже использовать, но для учебной программы так нагляднее.

2-Текстовый вариант XML схемы можно например  получить создав XDTO-пакет в любой конфигурации XDTO-пакет и  выполнив команду Экспорт XML схемы..)

В прилагаемой конфигурации все методы разбора XML представлены в общей команде РазобратьXML, там же в другой общей команде СоздатьXML представлены средства для создания тестовых данных.

Источник: https://infostart.ru/public/311011/

1С и файлы XML: запись и чтение

Чтение файла xml

Рассмотрим возможности 1С 8.3 работы с XML.

XML – это расширяемый язык разметки. В 1С широко применяется для обмена данными между конфигурациями, а также между другими внешними источниками данных с помощью данного механизма.

Рассмотрим два варианта работы с XML: средствами внутреннего языка и средствами внутреннего языка с использованием XDTO пакетов.

Чтение файла XML средствами внутреннего языка 1С

Создадим новый объект: ЧтениеXML. Он позволяет читать сообщения. Далее привожу простейший код, показывающий принцип чтения и разборки XML файла. Пояснения буду приводить в виде комментариев, чтобы не разрывать код на куски и его можно было скопировать для дальнейшего использования.

ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(“d:\Temp\Test.XML”);  //Открываем файл Пока ЧтениеXML.Прочитать() Цикл  //Цикл по структуре Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда  //Определяем начало элемента Пока ЧтениеXML.

ПрочитатьАтрибут() Цикл //Внутри элемента считываем атрибуты КонецЦикла; ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.Текст Тогда //Если это текст, читаем текст ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.

КонецЭлемента Тогда //Определяем дальнейшие действия КонецЕсли ; КонецЦикла;

Таким образом, зная структуру файла, можно его разобрать «по полочкам» в программе 1С.

Запись данных из 1C в XML

Так же создадим объект ЗаписьXML.

ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(“d:\Temp\Test.XML”, “UTF-8”); //Открываем файл для записи, указываем кодировку ЗаписьXML.ЗаписатьОбъявлениеXML();  // Записываем объявление XML ЗаписьXML.

ЗаписатьНачалоЭлемента(“Организации”); // Начало элемента Организации Выборка = Справочники.Организации.Выбрать(); Пока Выборка.Следующий() Цикл  // Начинаем выгружать организации ЗаписьXML.ЗаписатьНачалоЭлемента(“Организация”); // Начало элемента Организация ЗаписьXML.

ЗаписатьАтрибут(“Код”,Строка(Выборка.Код)); ЗаписьXML.ЗаписатьАтрибут(“Наименование”,Строка(Выборка.Наименование)); ЗаписьXML.ЗаписатьКонецЭлемента(); // Конец элемента Организация КонецЦикла; ЗаписьXML.

ЗаписатьКонецЭлемента(); // Конец элемента Организации

Таким образом мы выгрузим код и наименование всех организаций из справочника 1С «Организации».

Выгрузка из 1C в XML с помощью XDTO-пакетов

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания – попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

В 1С предприятии существует такой объект метаданных, как XDTO-пакеты. Они служат для обмена данными в формате XML.

XDTO-пакет позволяет создать структуру, по которой потом пойдет выгрузка данных. Покажу пример такой структуры:

Теперь, определив структуру (ее, кстати, можно загрузить из файла), мы можем смело сформировать файл:

МойXML = Новый ЗаписьXML; ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML(“UTF-8”, “1.0”, Ложь); МойXML.ОткрытьФайл(“d:\Temp\Test.XML”,  ПараметрыЗаписиXML); МойXML.ЗаписатьОбъявлениеXML(); ТипОбъектаАктивыВСистеме = ФабрикаXDTO.Тип(“www.primer.ru/assets”, “АктивыВСистеме”); ОбъектАктивыВСистеме = ФабрикаXDTO.

Создать(ТипОбъектаАктивыВСистеме); ОбъектАктивыВСистеме.ДатаВыгрузки = ТекущаяДата(); ТипОбъектаАктивы = ФабрикаXDTO.Тип(“www.primer.ru/assets”, “Активы”); ОбъектАктивы = ФабрикаXDTO.Создать(ТипОбъектаАктивы); ОбъектАктивыВСистеме.Добавить(ФормаXML.Элемент, “www.primer.ru/assets”, “Активы”, ОбъектАктивы); ТипОбъектаАктив = ФабрикаXDTO.Тип(“www.primer.

ru/assets”, “Актив”); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ОбъектАктив = ФабрикаXDTO.Создать(ТипОбъектаАктив); ОбъектАктив.Наименование = ВыборкаДетальныеЗаписи.Наименование; ОбъектАктив.ISIN = ВыборкаДетальныеЗаписи.ISIN; ОбъектАктивы.Актив.Добавить(ОбъектАктив); КонецЦикла; ФабрикаXDTO.ЗаписатьXML(МойXML, ОбъектАктивыВСистеме); МойXML.

Закрыть();

Вот так, определив заранее схему, можно создать файл любой сложности.

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник: https://programmist1s.ru/1s-i-xml-chtenie-i-zapis-v-primerah/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.