По теме из базы знаний
- Универсальная выгрузка в XML
- Основы языка запросов xpath, базовый синтаксис и применение в 1С 8.3 для работы с xml файлами сложной структуры
- Чтение и запись структуры XML
- Быстрая выгрузка в Excel с оформлением (числа, даты, колонтитулы, гиперссылки) через OpenXML
- Удаление пространств имен из XML файла, созданного на основе XDTO объекта
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В случае относительно небольшого размера файла:
ТекстДокумент = Новый ТекстовыйДокумент;
ТекстДокумент.Прочитать(ФайлПолноеИмя);
ТекстФайла = ТекстДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "<тег>СтароеЗначение</тег>", "<тег>СтароеЗначение</тег>");
ТекстДокумент.УстановитьТекст(ТекстФайла);
ТекстДокумент.Записать(ФайлПолноеИмя);
(5) Пошла таким путем... Но после замены и сохранения файла он не открывается как XML.Если открыть получившийся файл через WordPad и просто сохранить, то после этого файл нормально открывается в браузере.
Подскажите, пожалуйста, как корректно записать текстовый документ, чтобы он открывался как XML без дополнительных действий?
Подскажите, пожалуйста, как корректно записать текстовый документ, чтобы он открывался как XML без дополнительных действий?
ОбъектXML = Новый ЧтениеXML;
ОбъектXML.ОткрытьФайл(ПолныйПуть);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ОбъектXML);
ОбъектXML.Закрыть();
НужныйЭлемент = ДокументDOM.ПолучитьЭлементыПоИмени("FunctionCode")[0];
НужныйЭлемент.ТекстовоеСодержимое = "1";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПолныйПуть);
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ЗаписьXML.Закрыть();
Показать
Если файл реально большой, то тащить его весь в память не очень целесообразно, неважно уже в каком виде - как текстовый документ, или как dom объект.
Возможно, параллельное использование объектов ЧтениеТекста И ЗаписьТекста, с анализом текущей строки на предмет замены, будет и быстрее, и менее ресурсоемко.
Возможно, параллельное использование объектов ЧтениеТекста И ЗаписьТекста, с анализом текущей строки на предмет замены, будет и быстрее, и менее ресурсоемко.
Только так получилось
ИмяФайлаОбменаКИСУС="D:\Message_КИС_УС.XML";
ФайлОбменаКИСУС = Новый ЧтениеXML;
ФайлОбменаКИСУС.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ФайлОбменаКИСУС);
ФайлОбменаКИСУС.Закрыть();
для каждого стр из ДокументDOM.ДочерниеУзлы цИКЛ
для каждого стр1 из стр.ДочерниеУзлы Цикл
Попытка
стр1.Атрибуты.ПолучитьИменованныйЭлемент("НомерВходящегоСообщения").ЗначениеУзла="221";
Исключение
КонецПопытки;
кОНЕЦцИКЛА;
кОНЕЦцИКЛА;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ЗаписьXML.Закрыть();
Показать
(17)
ИмяФайлаОбменаКИСУС="c:\Users\korganov\Downloads\B661587_20081\B661587_20081.xml";
ФайлОбменаКИСУС = Новый ЧтениеXML;
ФайлОбменаКИСУС.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ФайлОбменаКИСУС);
ФайлОбменаКИСУС.Закрыть();
для каждого стр из ДокументDOM.ДочерниеУзлы цИКЛ
для каждого стр1 из стр.ДочерниеУзлы Цикл
Если стр1.ИмяУзла = "ZAP" Тогда
для каждого стр2 из стр1.ДочерниеУзлы Цикл
Если стр2.ИмяУзла = "N_ZAP" Тогда
стр2.ТекстовоеСодержимое="222222222222221";
КонецЕсли;
кОНЕЦцИКЛА;
КонецЕсли;
кОНЕЦцИКЛА;
кОНЕЦцИКЛА;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ЗаписьXML.Закрыть();
Показать
Чета сложна вы, батенька, бутерброды кушаете...
Но куда проще делается оное простым чтением текста:
Но еще проще через sed (как-то так):
ХМЛЧ = Новый ЧтениеХМЛ(ИмяФайла, прочаяМуть);
ХМЛЗ = Новый ЗваписьХМЛ(ИмяФайла2, прочаяМуть);
Пока ХМЛЗ.Прочитать() Цикл
Если ХМЛЧ.ТипУзла = НачалоЭлемента Тогда
ХМЛЗ.НачатьЗаписьЭлемента(ХМЛЧ.Имя);
ИначеЕсли ....// не хрен тут и вариантов: атрибуты и значения - прочитали, записали, если наш - поменяли
...
КонецЕсли;
КонецЦикла;
ХМЛЧ.Закрыть();
ХМЛЗ.Закрыть();
ПоказатьНо куда проще делается оное простым чтением текста:
Чтение = Новый ЧтениеТекста.ОткрытьФайло(ИмяФайла);
Запись = Новый ЗаписьТекста.ОткрытьФайло(ИмяФайла2);
Строка = Чтение.Прочитать();
Пока НЕ Строка = неопределено Цикл
Если СтрНайти(Строка, "тег/знечение/тра-та-та") тогда
Запись.ЗаписатьСтроку("ТоНаЧтоМеняем");
Иначе
Запись.ЗаписатьСтроку(строка);
КонецЕсли;
Строка = Чтение.Прочитать();
КонецЦикла;
Чтение.Закрыть();
Запись.Закрыть();;
ПоказатьНо еще проще через sed (как-то так):
sed file -e s/\<tag\>data\<\/tag\>/\<tag\>newData\<\/tag\>/ >file1
Рабочий пример
Процедура ПрочитатьФайлПравилИВнестиВставки(ПараметрыОбработки)
ФайлПравил = ПараметрыОбработки.ФайлПравилОбмена;
СписокУзловКЧтению = Новый СписокЗначений;
СписокУзловКЧтению.Добавить("ПередВыгрузкойОбъекта");
СписокУзловКЧтению.Добавить("ПослеЗагрузкиПравилОбмена");
УзелЧитаемТекст = Ложь;
ХМЛЧ = Новый ЧтениеXML;
ХМЛЧ.ОткрытьФайл(ФайлПравил); //Открываем файл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПараметрыОбработки.ПутьККаталогуПравилОбмена+"НовыеПравила.xml");
Пока ХМЛЧ.Прочитать() Цикл
Если ХМЛЧ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если СписокУзловКЧтению.НайтиПоЗначению(ХМЛЧ.Имя)<> Неопределено Тогда
Сообщить("Начало чтения узла = "+ХМЛЧ.Имя);
УзелЧитаемТекст = Истина;
КонецЕсли;
//ЗаписьXML.ЗаписатьНачалоЭлемента(ХМЛЧ.Имя);
ЗаписьXML.ЗаписатьТекущий(ХМЛЧ);
ИначеЕсли ХМЛЧ.ТипУзла = ТипУзлаXML.Текст и УзелЧитаемТекст Тогда
Сообщить("Содержание узла = "+ХМЛЧ.Значение);
ЗаписьXML.ЗаписатьТекст( "// новое знаечение тега");
ИначеЕсли ХМЛЧ.ТипУзла = ТипУзлаXML.КонецЭлемента и УзелЧитаемТекст Тогда
Сообщить("Конец чтения узла = "+ХМЛЧ.Имя);
УзелЧитаемТекст = Ложь;
// ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьТекущий(ХМЛЧ);
иначе
ЗаписьXML.ЗаписатьТекущий(ХМЛЧ);
КонецЕсли;
КонецЦикла;
ХМЛЧ.Закрыть();
ЗаписьXML.Закрыть();
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот