Как записать xml на диск
Я пытаюсь записать XML-файл, но он слишком велик для хранения в памяти, поэтому я хочу записать его прямо на диск. Я пробовал использовать XmlWriter, но у меня нет функции, позволяющей мне добавить в конец файла, поэтому я готов прибегнуть к записи необработанного XML с помощью обычного средства записи файлов.
Кто-нибудь знает какие-либо классы записи файлов, которые позволяют мне писать прямо на диск и которые позволяют мне перезаписывать позиции внутри файла?
Причина в том, что мне нужно иметь возможность писать поверх закрытия корневого элемента, чтобы я мог добавить еще один бит информации, а также иметь возможность читать XML-файл, когда это необходимо. Например, если бы у меня был следующий XML:
Если бы я хотел прочитать это, я мог бы, но если я хочу написать в него, я должен сначала удалить тег, добавить другой элемент, а затем снова добавить закрывающий тег.
Спасибо за любую помощь.
Я бы подумал, что вы можете открыть поток к файлу, искать до конца, построить XmlWriter и передать поток в Create . это не работает?
Я должен сказать, что, похоже, xml - не лучший способ хранить эти данные. Можно ли изменить схему так, чтобы имена тегов были короче (что уменьшило ее размер)? Есть ли причина, по которой это должен быть файл xml, а не в базе данных?
Вы можете использовать XmlTextWriter.
Просто откройте файл для записи, вернитесь к началу конечного элемента, а затем добавьте любые новые элементы, которые вы хотите, с помощью XmlTextWriter. Чтобы закрыть файл, просто напишите необработанный текст для конечного элемента, чтобы документ был завершен, и все готово.
Вот быстрый и грязный пример.
Начиная с XML следующим образом:
Вы можете открыть его и добавить такой элемент:
И вот результат:
Возможно, вы не получите идеального отступа и т. Д., Но это действительный XML. Это именно то, что вы сделали бы, если бы записали xml как необработанный текст в файл, но вы также можете использовать средство записи XML, чтобы выполнить форматирование за вас.
Я также согласен с некоторыми комментариями - было бы очень полезно использовать схему для вашего xml, которая минимизирует размер. Отключить отступ. Используйте как можно более короткие имена элементов и атрибутов. И если вы работаете с листовыми элементами, сохранение данных в виде атрибутов, а не cdata позволит сэкономить место (
Рассказываю на примере, как с помощью xml файлов выгружать/загружать метаданные (документы, справочники, регистры). Рассматривается клиент-серверный вариант. Вариант передачи файла на сервер. Вариант загрузки файла без создания временных файлов.
Перед Вами возникла задача загрузки, выгрузки метаданных (документы, справочники, регистры. ).
Возникнуть такая задача может по разным причинам. Как правило — это бэкап и перенос из базы в базу. Сейчас нас не интересует причина, просто примем как данность: потребовалась выгрузка, а затем последующая загрузка. Ее мы и будем сегодня выполнять.
Для более тонкой настройки выгрузки/загрузки можно использовать конфигурацию «Конвертация». Выгружать /загружать тут можно что угодно и как угодно, но изучение данного продукта потребует не одной недели практики.
А у Вас ситуация: нужно срочно что-то выгрузить / загрузить и некогда разбираться c существующими инструментами, а конфигуратор открывать Вы умеете, или нужно доработать уже существующий механизм, или разработать свой для пользователя, который не хочет разбираться в Конвертации, а хочет иметь «волшебную» кнопку, которая сделает все за него.
Для начала выполнения кода по загрузке или выгрузке нам нужно 2 кнопки: по нажатии на одну будет происходить выгрузка, а по нажатии на другую будет происходить загрузка. Где они будут расположены не важно, для примера, создадим обработку, в которую добавим форму, а на форму закинем эти 2 кнопки.
Формат выгрузки выберем xml, это стандарт и будем ему следовать, да и обрабатывать такой файл легче, чем, допустим, текстовой.
Для примера, добавим возможность выгрузки за период. Так как в выгрузке у нас выгружается только то что нам нужно, то загружать будем все подряд (хотя дело Ваше, можете добавить условия и в загрузку).
В результате у Вас должна получиться форма похожая на:
Переходим в модуль формы и вставляем следующий текст:
Возвращаемся в форму. Переходим во вкладку команд формы. И указываем для команды выгрузить действие выгрузить, для команды загрузить действие загрузить:
В принципе, для моей конфигурации обработка уже рабочая. Но под Ваши задачи ее нужно переделать. А для этого разберем код.
Процедура ПриОткрытии устанавливает по умолчанию даты периода. Чтобы процедура срабатывала при открытии формы, ее следует указать в соответствующем событии формы.
Делать это не обязательно. Просто для удобства пользования.
Небольшое отступление.
Прежде всего, нам нужно понять, что наш персональный компьютер и сервер в большинстве случаев — это разные компьютеры. По крайней мере так рекомендовано. 1С и я вместе с ними будем исходить из того, что вы работаете за клиентским ПК, а исполняемый код и база данных находятся на другом — сервере.
Продолжаем исходить из того, что сервер — это отдельный компьютер (даже если это не так, но для универсальности кода придется так считать - Ваш ПК будет сервером для самого себя).
Так вот 1С решила, что добавлять/читать документы или записи в справочнике можно только на сервере.
Соответственно, код по добавлению, изменению, чтению, будет выполняться на ДРУГОМ ПК. Не на Вашем!
А так как файлы сервера — это не Ваши файлы, а Ваши файлы — это не файлы сервера. То нам нужно какое-то общее и для Вас и для сервера хранилище файлов. Вот в нем и будут происходить все операции. Такое хранилище называется временным.
Разбираем код выгрузки.
Команду выгрузки я подглядел в обработке ВыгрузкаЗагрузкаДанныхXML83.epf, о которой я говорил выше. Так что выгрузка у нас будет вполне себе типовая (правда я выкинул кучу строк ненужного кода, чем облегчил Вам труд)
Первым делом на клиенте создаем общее хранилище:
АдресФайлаВоВременномХранилище, так как мы не знаем ничего про него, то присваиваем ему пустой адрес.
Затем строчкой ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище); мы заполняем наше временное хранилище данными которые хотим сохранить в виде файла.
Строкой ПолучитьФайл(АдресФайлаВоВременномХранилище, "Выгрузка.xml"); мы забираем из временного хранилища на свой компьютер данные, которые можно или посмотреть или сохранить в виде файла с названием Выгрузка.xml. Это стандартная процедура. Работает везде одинаково и разбору не подлежит.
А вот процедуру ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище) разберем подробнее. Именно в ней происходит создание и заполнение временного файла обмена.
На сервере еще нет нужного нам файла, а потому первыми двумя строками мы определяем временный файл на сервере. Код выполняется на сервере, а потому временный файл тоже будет на сервере. Его мы заполним и поместим во временное хранилище из которого уже заберем себе на клиента.
Далее запросом получаем данные, которые необходимо выгружать в файл. Для примера, взят абстрактый документ, который называется ФП_Месячный, у него есть реквизиты: Дата, Номер, Период и табличная часть: Статьи.
Далее идет блок заполнения временного файла данными из запроса.
Первым делом мы объявляем новую ЗаписьXML. С помощью нее будет производиться запись во временный файл: ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла,"UTF-8");
UTF-8 — это кодировка текста. Ее можно принять как стандарт для большинства случаев.
ЗаписьXML.ЗаписатьОбъявлениеXML() - записываем во временный файл служебную информацию, например, информацию о кодировке. Тут думать не надо. Метод стандартный, все что нужно сделает сам.
Далее запись информации идет по принципу скобок в тексте. Есть открывающая, есть закрывающая и что-то в середине. Можно вкладывать одни элементы в другие:
Открываем элемент: ЗаписьXML.ЗаписатьНачалоЭлемента("НазваниеЭлемента");
//что-то делаем, конкретно в нашем случае, мы делаем запись о реквизите документа либо о самом документе
Закрываем элемент: ЗаписьXML.ЗаписатьКонецЭлемента()
Во время записи активно пользуемся функцией XMLСтрока(), которая преобразует метаданные в строковой тип, понятный для записи/чтения XML.
Так как сохранять данные мы можем только простые (число, дата, строка, булево…). То ссылочный тип данных Вид (это справочник с видами статей) мы сохранить не можем. Но мы можем сохранить Код Вида из справочника видов — это строка. Когда мы будем наоборот загружать данные из ХML, то мы будем получать Код. По коду искать ссылку в справочнике. И уже эту ссылку записывать в документ.
После того как документ xml сформирован (а именно это мы и делали). Мы ЗаписьXML помещаем в файл, хотя по сути, он и так временный файл, проверяем всели у нас получилось, и если да, то помещаем данные во временное хранилище. Почему это так сделано, я не знаю, механизм типовой.
Ну и последним делом, мы удаляем на сервере временный файл. Если это не сделать, то сервер быстро переполниться временными файлами.
Вообще ситуация с временными файлами мне не нравится. Если загрузка/выгрузка будет идти постоянно, то накопитель сервера быстро выйдет из строя. Но так сделано разработчиками 1С. Этот код я подсмотрел у них в стандартной обработке.
Если можете подсказать как сделать все в оперативной памяти буду благодарен.
Разбираем код загрузки.
Тут уж я не поленился не стал брать типовой механизм, обшарил все форумы и нашел как провести загрузку без использования временных файлов.
Вообще варианта 2:
1. Простой. Считать xml файл в переменную (массив) на клиенте. А после передав эту переменную на сервер, читая данные из массива записывать новые документы.
2. Интересный. Передать xml файл на сервер и читать строки из него в оперативной памяти, не используя файлы вообще.
Оба этих метода требуют значительного количества памяти на сервере, а потому рекомендуется делать проверку на количество передаваемой информации. И если ее много, то всеже использовать файловый вариант и читать из файла блоками.
Рассмотрим вариант 2.
Помещать файл выгрузки на сервер во временное хранилище мы будем стандартной процедурой НачатьПомещениеФайла(). Так как механизм типовой, я просто скопировал код из примера 1С.
Для всех он будет одинаков. Единственно что я поменял, это фильтр (сделал xml). Стоит еще обратить внимание на размер. В моем случае он равен 4Гб. В Вашем, можете сделать меньше (больше нельзя).
Процедуру ПоместитьФайлКомандаЗавершение() переписал полностью. В ней я смотрю был ли выбран файл. Если файл был выбран, если он удовлетворяет размеру и расширению, тогда будет происходить чтение из данных указного файла в процедуре ОбработатьНаСервере(Адрес), где Адрес — это адрес временного хранилища. Ну а после того, как мы добавим данные, следует попросить систему перечитать базу, так как данные изменились. Это мы делаем процедурой ОповеститьОбИзменении(Тип("ДокументСсылка.ФП_Месячный")). Делать это не обязательно, но тогда чтобы увидеть результат нам придется закрыть и снова открыть список документов ФП_Месячный.
Рассмотрим процедуру ОбработатьНаСервере(Адрес)
Первым делом на сервере из временного хранилища нужно получить то, что мы помещали на клиенте: Данные = ПолучитьИзВременногоХранилища(Адрес);
Объявляем новую переменную с типом ЧтениеXML. В ней будет храниться весь документ XML.
Хитрая строка Парсер.УстановитьСтроку(ПолучитьСтрокуИзДвоичныхДанных(Данные,КодировкаТекста.UTF8)) преобразует двоичные данные в строку xml, которую затем записывает в объявленную ранее переменную с типом ЧтениеXML.
А далее читаем каждую строчку из XML и, в зависимости от данных, заполняем документ.
Ссылочные данные документа заполняются через их поиск по коду из xml.
Отступление.
Да возможность передачи ссылки имеется. Но я не рекомендую ее использовать, дабы данные не задвоились. То есть Документы с одинаковыми Кодами по сути будут разные так как у них разные ссылки (GUID). А если вести запись по коду документа, то документов с одинаковыми кодами Вы не получите. Будет сформировано исключительное событие и перенос данных в базу будет приостановлен. Поэтому я использую оператор попытка при записи документа. Если документ с таким кодом и датой уже есть, то запись произведена не будет, а будет переход к следующей записи.
PS. Благодаря подсказке Сергея, код преобразования данных в XML можно серьезно сократить. Просто замените функцию и процедуру. Будет менее понятно, что такое XML, как он должен заполняться и читаться, но ведь и не всем это надо:
(7) соврал
когда пишу файл вот так
[1С]
ИмяФайла = "D:\1c8\wqwerty.xml";
Файл = Новый Файл(ИмяФайла);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("root");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
[/1C]
Можно так попробовать:
(13) Так пользователь выбирает каталог на своей машине локальной.
Пишется далее на сервере (код вышеописанный выполняется на сервере)
ИмяФайла передается с клиента в эту процедуру (пользователь открывает диалог и пишет куда сохранить )
(17) учту
(12)то есть файл надо создать на сервере во временной папке а потом его вернуть на клиента - так выходит
сам 1С не понимает то что 20 лет назад в ADO еще было реализовано
(19) (18) 1С это не программирование
стоит только прочитать дифирамбы по поводу динамических списков, которые уже в 1995 году успешно работали еще в BDE чтобы понять это)))
Я понимаю, что они сделали но не могу понять почему не реализван простейший функционал, который работает с пользователем на клиенте АВТОМАТИЧЕСКИ при работе например с базами через другие компоненты.
(20) Файл хранится на диске и туда же и пишется.
Но, на клиенте и на сервере диски могут быть совершенно разные.
Если мы пишем на клиенте, то ничего нам не мешает, только для записи данные нужно как-то передать с сервера.
Если мы хотим писать на сервере, то потом нужно файл передавать на клиента, что на самом деле, сложнее.
(20) Для тебя 1С тоже много чего делает автоматически - например - разделяет твой кривой код на клиентский и серверный, и, в отличие от тебя, прекрасно понимает, что и где выполняется.
(20) >>. не могу понять почему не реализван простейший функционал, который работает с пользователем на клиенте.
Как он может работать, если у тебя русским языком написано - на сервере?
>>&НаСервере
Сам то понимаешь чего хочешь?
коллеги спорить уже скучно) объяснять что имелось ввиду неинтересно
для любопытных - напишите простейший код взаимодействия с сервером любым через ADO и почувствуйте разницу. А еще понимание того что Сервер 1С как таковой не является сервером выполняющим функцию сервера приложений, а отбрасывая вопросы распределения памяти по процессам решает только задачу трансляции запроса на разные сервера. Потому DML не реализован и много чего еще. А кроме того например БП30 в клиент серверном варианте больше не поддерживает толстого клиента, и можно много рассуждать но сами то понимаете что хлеб свой получаем от того что продукт СЫРОЙ вечно и требует дорабтки. Так что недостаток 1С+политика его распространения далА хлеба "программистам" до поры до времени пока например R-Style не займется эти проектом ;-)
Я щетаю, Сергей Иванович полностью прав и ему не стоит иметь дел с этой б-гмерской 1С и шевелить булками из данной специальности.
В клиент серверном варианте в толстом клиенте при открытии форм выдает ошибку Ошибка при подписке ОбработкаПолученияФормыПользователяДляНеразделенныхПользователей" на событие ОбработкаПолученияФормы произошла ошибка.Обработчки события не найден.
Причина в том что в модуле ПользователиСлужебныйВМоделиСервисаБТС крыжик Вызов сервера не стоит, и еще много всего интересного понаделано такого кривого
(27) а я и не имею с ней дела, я из кривой 1С данные забираю для других целей, так что булки мои шевеляться в отличие от мозга спецов в 1С которые такие релизы выпускают.
Или скажете нет таких багов в нем?
(29) Я щетаю, что 1С - дико динамично развивающееся решение.
Как в платформе, так и в конфигурациях.
Особенно поражает количество абилок в платформе, "из коробки".
Многие полезны, некоторые - нафиг не нужны, иногда - само зло. Но не в этом суть. Суть в том, что:
1) Конечно при такой динамике будут ошибки, много и еще каких.
2) Дятлы, не угнавшиеся за паровозом, будут фрустрировать и фаломорфировать и гнать на 1С гору мусора. Особенно спасибо за это УправляемомуПриложению (в простонародье, Тонкому клиенту), он дает прикурить динозаврам.
(31) это философия стакан либо пуст либо полон наполовину, но если бы такое динамичное решение управляло вашим банковским счетом, думаю вы запели бы другим голосом. Или например можно для автопилота написать программное управление такое вот динамично развивающееся, но щетаю уважаемый защемится сесть в этот аппарат, а вот почему то финансами управлять таким образом позволительно?
XML-формат предназначен для хранения данных, которые могут пригодиться в работе некоторых программ, сайтов и поддержки определённых языков разметки. Создать и открыть файл с таким форматом не сложно. Это вполне можно сделать, даже если на компьютере не установлено какое-либо специализированное программное обеспечение.
Немного об XML
Сам по себе XML — это язык разметки, чем-то похожий на HTML, который используется на веб-страницах. Но если последний применяется только для вывода информации и её правильной разметки, то XML позволяет её структурировать определённым образом, что делает этот язык чем-то похожим на аналог базы данных, который не требует наличия СУБД.
Создавать XML-файлы можно как при помощи специализированных программ, так и встроенным в Windows текстовым редактором. От вида используемого ПО зависит удобство написания кода и уровень его функциональности.
Способ 2: Nero
Среди всего существующего софта для прожига дисков наиболее известной по праву считается Nero, поскольку разработчики уже много лет поддерживают работоспособность данного ПО, радуя любителей постоянными обновлениями и улучшениями. Здесь следует учитывать тот факт, что приложение распространяется платно, а пробная версия доступна для использования сроком на две недели. Потом придется либо отказываться от программы, либо покупать лицензионный ключ. Пока отложим это решение на потом, ведь всегда сначала требуется лучше узнать основную функциональность.
- Воспользуйтесь указанной выше ссылкой, чтобы скачать и установить Nero. После запуска переходите в раздел «Nero Burning ROM».
После запустится процесс прожига. Ожидайте его окончания, об этом будет свидетельствовать появившееся уведомление. Если вас заинтересовало взаимодействие с Nero и вы желаете продолжить использование этого софта на постоянной основе, перед покупкой рекомендуем ознакомиться с отдельной статьей на нашем сайте, где разбираются основные области применения данного ПО. Это поможет изучить все аспекты инструмента.
Способ 1: Visual Studio
Вместо этого редактора кода от Microsoft можно использовать любой его аналог от других разработчиков. По факту Visual Studio является более расширенной версией обычного «Блокнота». Код теперь имеет специальную подсветку, ошибки выделяются или исправляются автоматически, также в программу уже загружены специальные шаблоны, которые позволяют упростить создание XML-файлов больших объёмов.
Для начала работы вам нужно создать файл. Нажмите по пункту «Файл» в верхней панели и из выпадающего меню выберите «Создать…». Откроется список, где указывается пункт «Файл».
В только что созданном файле уже будет первая строка с кодировкой и версией. По умолчанию прописана первая версия и кодировка UTF-8, которые вы можете поменять в любое время. Дальше для создания полноценного XML-файла вам нужно прописать всё то, что было в предыдущей инструкции.
По завершении работы снова выберите в верхней панели «Файл», а там из выпадающего меню пункт «Сохранить всё».
Способ 2: Microsoft Excel
Можно создать XML-файл и не прописывая код, например, при помощи современных версий Microsoft Excel, который позволяет сохранять таблицы с данным расширением. Однако нужно понимать, что в этом случае создать что-то более функциональное обычной таблицы не получится.
Такой способ больше подойдёт тем, кто не хочет или не умеет работать с кодом. Однако в этом случае пользователь может столкнуться с определёнными проблемами при перезаписи файла в XML-формат. К сожалению, проделать операцию преобразования обычной таблицы в XML можно только на самых новых версиях MS Excel. Чтобы это сделать, используйте следующую пошаговую инструкцию:
- Заполните таблицу каким-либо контентом.
- Нажмите на кнопку «Файл», что в верхнем меню.
Записываем файлы на диск
Далее мы хотим наглядно продемонстрировать принцип работы трех программ, предназначенных для помощи пользователю в записи любых файлов на диск, прикладывая при этом минимальное количество усилий. Вы можете заметить, что алгоритмы действий во всех ПО похожи, однако внимание здесь следует обращать в первую очередь на дополнительные функции, которые иногда оказываются полезными определенным юзерам.
Способ 1: CDBurnerXP
Начать хотелось бы с бесплатного программного обеспечения под названием CDBurnerXP, поскольку такие решения пользуются наибольшей популярностью в связи с отсутствием различных ограничений. Однако рассчитывать на большое количество дополнительных инструментов не стоит. Что касается самого процесса записи файлов, то происходит это так, как показано в следующем руководстве.
Обратите внимание, что программа CDBurnerXP является простым инструментом для прожига дисков с минимумом настроек. Если вам требуется куда более расширенный пакет профессиональных инструментов, лучше выполнить запись информации на накопитель, воспользовавшись Способом 2.
- Установите программу на компьютер, вставьте болванку в привод и запустите CDBurnerXP.
- На экране отобразится главное окно, где выберите первый пункт «Диск с данными».
Помимо файлов вы можете добавлять и создавать любые папки, чтобы проще ориентироваться в содержимом накопителя.
Способ 3: Блокнот
Для работы с XML вполне подойдёт даже обычный «Блокнот», однако пользователю, который не знаком с синтаксисом языка, придётся трудно, так как в нём нужно прописывать различные команды и теги. Несколько проще и значительно продуктивнее процесс будет идти в специализированных программах для редактирования кода, например, в Microsoft Visual Studio. В них есть специальная подсветка тегов и всплывающие подсказки, что значительно упрощает работу человеку, плохо знакомому с синтаксисом этого языка.
Для этого способа не потребуется что-либо скачивать, так как в операционную систему уже встроен «Блокнот». Давайте попробуем сделать в нём простую XML-таблицу по данной инструкции:
-
Создайте обычный текстовый документ с расширением TXT. Разместить его можно где угодно. Откройте его.
Примерно так у вас должен выглядеть готовый результат:
XML-компиляторы должны обработать этот код в виде таблицы с одной колонкой, где указаны данные о неком Иване Иванове.
В «Блокноте» вполне можно сделать несложные таблицы наподобие этой, но при создании более объёмных массивов данных могут возникнуть сложности, так как в обычном «Блокноте» нет функций исправления ошибок в коде или их подсветки.
Как видите в создании XML-файла нет ничего сложного. При желании его может создать любой пользователь, который более-менее умеет работать на компьютере. Однако для создания полноценного XML-файла рекомендуется изучить данный язык разметки, хотя бы на примитивном уровне.
Мы рады, что смогли помочь Вам в решении проблемы.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
Иногда CD или DVD используется в качестве носителя, на котором хранятся самые разнообразные файлы, то есть его основная задача сравнима с флешкой. В таких случаях прожиг выполняется немного по другим стандартам, естественно, с помощью специального программного обеспечения. Если вдруг вам понадобилось хранить на диске какие-либо объекты, советуем ознакомиться с приведенными ниже способами, чтобы максимально детально изучить этот вопрос.
Способ 3: Astroburn Lite
Еще одно бесплатное программное обеспечение в нашем сегодняшнем материале называется Astroburn Lite и выделяется среди остальных решений простотой использования. Все действия выполняются буквально в пару кликов и выглядят следующим образом:
-
После успешного запуска Astroburn Lite перейдите во вкладку «Файлы».
Ожидайте завершения записи, и можете сразу же переходить к работе с содержимым.
Существуют пользователи, которым приведенные выше варианты не подходят по разным причинам. В таком случае мы советуем задействовать абсолютно любую программу для прожига, которая приглянется вам. Практически все они позволяют записывать любые файлы и работают примерно по одному и тому же принципу. Подробные обзоры на популярные решения ищите далее.
На этом наша статья подходит к концу. Из нее вы узнали о методах записи файлов на CD или DVD. Как видите, ничего сложного во взаимодействии с ПО нет, поэтому можно смело скачивать понравившийся вариант и выполнять поставленную задачу.
Мы рады, что смогли помочь Вам в решении проблемы.
Отблагодарите автора, поделитесь статьей в социальных сетях.
Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
Читайте также: