Изменить текст файла XML

1. Aleksandr_prof 195 15.07.20 12:37 Сейчас в теме
Проблема: в файле XML несколько элементов верхнего уровня. Из-за этого невозможно корректно прочитать файл XML в 1С.
Задача: устранить это, объединив все записи в один элемент первого уровня.
Вопрос: как это сделать ПРОГРАММНО? Как получить текст XML для последующего его изменения?

На скриншоте визуально объяснил суть вопроса.
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
16. alex_bob 246 15.07.20 13:08 Сейчас в теме +0.5 $m
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ИмяФайлаXML, "windows-1251");
СтрокаXML = Текст.ПолучитьТекст();
// дальше те строки, что я писал раньше
Текст.УстановитьТекст(СтрокаXML);
Текст.Записать(ИмяФайлаXML, "windows-1251");
Aleksandr_prof; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. soft_wind 15.07.20 12:43 Сейчас в теме
(1)
невозможно корректно прочитать файл XML в 1С.

Бред какой-то!
Просто программу чтения, немного доработать надо,
Вы на эту замену больше времени потратите!!!
Файл ХМЛ абсолютно правильный!!!
3. Aleksandr_prof 195 15.07.20 12:46 Сейчас в теме
(2) Программа чтения - это платформа 1С. Предлагаете мне платформу доработать?
23. shurikvz 15.07.20 20:16 Сейчас в теме
(2)
Файл ХМЛ абсолютно правильный!!!

Это троллинг?
Корректный xml документ должен содержать только один пролог, располагающийся в начале документа.
4. lefthander 15.07.20 12:46 Сейчас в теме
(1)Может разделить на три файла? Ну или по количеству секций верхнего уровня... ;)
5. Aleksandr_prof 195 15.07.20 12:47 Сейчас в теме
(4) Нужно объединить в один файл (удалить эти ненужные строки разделения). Вопрос в том, как это сделать.
7. lefthander 15.07.20 12:51 Сейчас в теме
(5)есть три секции- оставляем строку начало от первой секции и строку конец от последней, все остальные убираем. То что внутри секций не трогаем- так пойдет?
И заголовок тоже соответственно удаляем
11. Aleksandr_prof 195 15.07.20 12:56 Сейчас в теме
(7)
(5)есть три секции- оставляем строку начало от первой секции и строку конец от последней, все остальные убираем. То что внутри секций не трогаем- так пойдет?

Пойдёт, я бы даже сказал, что именно так и нужно.
13. lefthander 15.07.20 12:58 Сейчас в теме
(11)второй и 3 заголовок с версией и енкодингом тоже надо убрать.
14. Aleksandr_prof 195 15.07.20 12:58 Сейчас в теме
(13) Всё верно. Их тоже нужно убрать
6. soft_wind 15.07.20 12:47 Сейчас в теме
(1) а по картинке очень похоже что у вас не очищается файл выгрузки этого ХМЛ
и происходит дописка новых отчетов,

чистите файл, перед формированием.
alex-l19041; +1 Ответить
10. soft_wind 15.07.20 12:56 Сейчас в теме
(1) ну и для самых упертых, такой вариант
открываете файл как текст
и одной командой СтрЗаменить
меняете , вот такой кусок кода

"</ReportXML>
<?xml version="1.0" encoding="windows-1251"?>
<ReportXML>"

на "" (пусто)

сохраняете файл
12. Aleksandr_prof 195 15.07.20 12:58 Сейчас в теме
(10) В том то и проблема. Как открыть xml файл как текст? Потом его изменить и записать обратно.
18. soft_wind 15.07.20 13:09 Сейчас в теме
(12) Это вы серьезно, не знаете как текстовые фалы читать?

лкДок = Новый ТекстовыйДокумент;
лкДок.Прочитать(...);
лкТекст = лкДок.ПолучитьТекст();
лкТекст = СтрЗаменить("ЧтоЗаменить", ""); //Всего одна команда замены
лкДок.УстановитьТекст(лкТекст);
лкДок.Записать(...);
alex-l19041; +1 Ответить
19. Aleksandr_prof 195 15.07.20 13:21 Сейчас в теме
(18) Не сразу понял как сделать это с XML =) Суть вашей подсказки верная, дальше сам, там файлы сложнее, с циклами буду делать. Благодарю
8. user1373297 15.07.20 12:55 Сейчас в теме
прочитать файл как текстовый со второй строки по предпоследнюю. если входит репортХМЛ - удалять
только идти надо снизу вверх
9. alex_bob 246 15.07.20 12:56 Сейчас в теме
Позиция = СтрНайти(СтрокаXML, "</ReportXML>");
ПодстрокаПоиска = Сред(СтрокаXML, Позиция);
Позиция = СтрНайти(ПодстрокаПоиска, "<ReportXML>");
ПодстрокаПоиска = Сред(ПодстрокаПоиска, 1, Позиция + 11);
СтрЗаменить(СтрокаXML, ПодстрокаПоиска, "");

Здесь СтрокаXML - содержимое вашего файла.
Aleksandr_prof; +1 Ответить
15. Aleksandr_prof 195 15.07.20 13:00 Сейчас в теме
(9)
Здесь СтрокаXML - содержимое вашего файла.


В этом и есть ключевая загвоздка! Как получить содержимое файла, изменить его, и записать вместо существующего файла?
16. alex_bob 246 15.07.20 13:08 Сейчас в теме +0.5 $m
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ИмяФайлаXML, "windows-1251");
СтрокаXML = Текст.ПолучитьТекст();
// дальше те строки, что я писал раньше
Текст.УстановитьТекст(СтрокаXML);
Текст.Записать(ИмяФайлаXML, "windows-1251");
Aleksandr_prof; +1 Ответить
17. Aleksandr_prof 195 15.07.20 13:08 Сейчас в теме
(16) Сейчас буду проверять
20. Aleksandr_prof 195 15.07.20 15:49 Сейчас в теме
Возможно кому-то понадобится полное решение данной задачи. Выложу здесь:
Процедура ПроверитьИИсправитьФайлXML(ИмяФайлаДанных);
	
	// Так как в документе XML допускается только один элемент верхнего уровня, а наша "Загрузка.Онлайн" выдаёт нам иногда
	// файлы с несколькими элементами верхнего уровня, будем эту проблему контролировать и исправлять
	Текст = Новый ТекстовыйДокумент;
	Текст.Прочитать(ИмяФайлаДанных, "windows-1251");
	СтрокаXML = Текст.ПолучитьТекст();
	ЧислоВхожденийКодировки = СтрЧислоВхождений(СтрокаXML, "<?xml version=""1.0"" encoding=""Windows-1251""?>");
	ЧислоВхожденийReportXML = СтрЧислоВхождений(СтрокаXML, "<ReportXML>");	
	Если ЧислоВхожденийКодировки > 1 или ЧислоВхожденийReportXML > 1 тогда
		// Убираем все <?xml version="1.0" encoding="Windows-1251"?>,
		// Убираем все <ReportXML>,
		// Убираем все </ReportXML>
		СтрокаXML = СтрЗаменить(СтрокаXML, "<?xml version=""1.0"" encoding=""Windows-1251""?>", "");
		СтрокаXML = СтрЗаменить(СтрокаXML, "<ReportXML>", "");
		СтрокаXML = СтрЗаменить(СтрокаXML, "</ReportXML>", "");		
		// Приводим строку XML к каноническому виду (строка кодировки - начало элемента первого уровня - записи - конец элемента первого уровня)
		СтрокаXML = "<?xml version=""1.0"" encoding=""Windows-1251""?>" + "<ReportXML>" + СтрокаXML + "</ReportXML>";
		Текст.УстановитьТекст(СтрокаXML);
		Текст.Записать(ИмяФайлаДанных, "windows-1251");
	КонецЕсли;	
	
КонецПроцедуры
Показать
21. lefthander 15.07.20 15:51 Сейчас в теме
(20)
а наша "Загрузка.Онлайн" выдаёт нам иногда
а не пробовали загрузку посмотреть - почему она так выдает? ;) чисто риторический вопрос
22. Aleksandr_prof 195 15.07.20 15:58 Сейчас в теме
(21) Даже не хочу =) Потому что я уже представил, как я заставляю этих разработчиков (а на них ещё надо выйти) изменить свой алгоритм выгрузки с сайта. Их программа не связана ни с 1С, ни даже с битрикс. Эту ошибку мне проще самому изменить здесь и сейчас за отдельную плату, чем проходить эти 9 кругов ада бюрократического согласования изменений, а потом ещё нести за это ответственность, причём бесплатно.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот