Запись в файл XML

1. Hr1zantema 30.05.26 17:08 Сейчас в теме
Добрый день. Осуществляю замену атрибута в XML файле и записываю в тот же файл.

  Данные = ПолучитьИзВременногоХранилища(Хранилище);
	Расширение = ".xml";
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
	
	Данные.Записать(ИмяВременногоФайла);
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
	ЧтениеXML.Закрыть();
	
	СписокЭлементовDOM = ДокументDOM.ПолучитьЭлементыПоИмени("Файл");
	
	Для Каждого ЭлементDOM Из СписокЭлементовDOM Цикл
		Если ЭлементDOM.ЕстьАтрибут("ИдФайл") Тогда
			ЭлементDOM.УстановитьАтрибут("ИдФайл",СтрЗаменить((ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("ИдФайл").Значение),"_0_0_0_0_0_00", "_0_1_0_0_0_00"));
		КонецЕсли;
	КонецЦикла;

        ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "windows-1251");	
	ЗаписьDOM = Новый ЗаписьDOM;
	ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
	
	ЗаписьXML.Закрыть();
Показать

вторая строка была:
Файл xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

стала
<Файл xmlns:xsd="http://www.w3.org/2001/XMLSchema"

Подскажите, пожалуйста, что не так почему изменилась с xmlns:xsi на xmlns:xsd и обрезало адрес.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 33 31.05.26 12:33 Сейчас в теме
(1) Приложи файлы до и после.
Если эти пространства имен не используются в файле, а есть только в этом месте, то как бы вообще пофиг.
4. Hr1zantema 31.05.26 12:51 Сейчас в теме
(2)

подскажите, пожалуйста, как надо сделать?

СписокЭлементовDOMДопСведТов = ДокументDOM.ПолучитьЭлементыПоИмени("ДопСведТов");
Для Каждого ЭлементDOM Из СписокЭлементовDOMДопСведТов Цикл
Если ЭлементDOM.ЕстьАтрибут("КодТов") Тогда

Атрибут = ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("КодТов").Значение;

KIZ = НайтиKIZ(Атрибут);

Для Каждого Строка Из KIZ Цикл

ЭлементDOM.УстановитьАтрибут("КИЗ",Строка);

//в данном случае было:
//<ДопСведТов КодТов="00-0000" />

//стало:
//<ДопСведТов КодТов="00-0000" КИЗ="0000000000000000000000000000000"/>

//а надо:
//<ДопСведТов КодТов="00-0000">
// <НомСредИдентТов>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// </НомСредИдентТов>
//</ДопСведТов>
КонецЦикла;
КонецЕсли;
КонецЦикла;
5. gml 31.05.26 13:35 Сейчас в теме
(4) Ваш код сделал всё так, как было написано - вставил 4 атрибута с одинаковым именем "КИЗ", которые свернулись в один.
Имя атрибута в составе элемента должно быть уникальным. Повторяющимися могут быть только элементы.

Если Вы хотите сделать "то, что надо" -
- в каждый элемент ДопСведТов в цикле
- вставьте один дополнительный элемент НомСредИдентТов без атрибутов
- вставьте в него в цикле необходимое количество дополнительных элементов КИЗ с соответствующими текстовыми значениями (не атрибутами!)
Hr1zantema; +1 Ответить
7. Hr1zantema 31.05.26 16:14 Сейчас в теме
(5) Спасибо поучилось
16. Hr1zantema 03.06.26 07:49 Сейчас в теме
(5) Доброе утро.
Подскажите, пожалуйста, как сделать так:

<СведТов НомСтр="1" НаимТов="ЧЧЧЧЧ" ОКЕИ_Тов="00" НаимЕдИзм="шт" КолТов="1" ЦенаТов="0.00" СтТовБезНДС="0.20" НалСт="22%" СтТовУчНал="0.00">
<ДопСведТов КодТов="85-0058">
<НомСредИдентТов>
<КИЗ>0000000000000000000000</КИЗ>
<КИЗ>0000000000000000000000</КИЗ>
<КИЗ>0000000000000000000000</КИЗ>
<КИЗ>0000000000000000000000</КИЗ>
</НомСредИдентТов>
</ДопСведТов>

У меня сейчас выходит вот так:

<СведТов НомСтр="1" НаимТов="ЧЧЧЧЧ" ОКЕИ_Тов="00" НаимЕдИзм="шт" КолТов="1" ЦенаТов="0.00" СтТовБезНДС="0.20" НалСт="22%" СтТовУчНал="0.00">
<ДопСведТов КодТов="00-0000">
<НомСредИдентТов>
<КИЗ>0000000000000000000000</КИЗ>
</НомСредИдентТов>
<НомСредИдентТов>
<КИЗ>0000000000000000000000</КИЗ>
</НомСредИдентТов>
<НомСредИдентТов>
<КИЗ>0000000000000000000000</КИЗ>
</НомСредИдентТов>
</ДопСведТов>

Делаю вот так:

СписокЭлементов_ДопСведТов = ДокументDOM.ПолучитьЭлементыПоИмени("ДопСведТов");
	Для Каждого Элемент_ДопСведТов Из СписокЭлементов_ДопСведТов Цикл
		Если Элемент_ДопСведТов.ЕстьАтрибут("КодТов") Тогда
			
			Атрибут = Элемент_ДопСведТов.Атрибуты.ПолучитьИменованныйЭлемент("КодТов").Значение;
			
			Отбор.Вставить("Артикул", Атрибут);
			НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
			Если НайденныеСтроки <> Неопределено Тогда
				Для Каждого Строка Из НайденныеСтроки Цикл
					Если Строка.Артикул = Атрибут  и ЗначениеЗаполнено(Строка.KIZ) Тогда
						//создаем новые элементы
						НомСредИдентТов = ДокументDOM.СоздатьЭлемент("НомСредИдентТов");
						КИЗ = ДокументDOM.СоздатьЭлемент("КИЗ");
						//добавляем уровень НомСредИдентТов
						Элемент_ДопСведТов.ДобавитьДочерний(НомСредИдентТов);
						//находим ветку НомСредИдентТов
						СписокЭлементов_НомСредИдентТов = ДокументDOM.ПолучитьЭлементыПоИмени("НомСредИдентТов");
						Для Каждого Элемент_НомСредИдентТов Из СписокЭлементов_НомСредИдентТов Цикл
							//добавляем уровень КИЗ
							Элемент_НомСредИдентТов.ДобавитьДочерний(КИЗ);
							//находим ветку КИЗ
							СписокЭлементов_КИЗ = ДокументDOM.ПолучитьЭлементыПоИмени("КИЗ");
							Для Каждого Элемент_КИЗ Из СписокЭлементов_КИЗ Цикл
								Элемент_КИЗ.ТекстовоеСодержимое = Строка.KIZ;
							КонецЦикла;
						КонецЦикла;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
Показать
6. Sashares 33 31.05.26 13:36 Сейчас в теме
(4)
Код
ЭлементDOM.УстановитьАтрибут("КИЗ",Строка);

устанавливает атрибут КИЗ в элемент.

//стало:
//<ДопСведТов КодТов="00-0000" КИЗ="0000000000000000000000000000000"/>

Тут КИЗ атрибут.

Если надо не атрибутом это, а элементом, надо создавать элемент и добавлять в нужное место.
НовыйЭлемент = ДокументDOM.СоздатьЭлемент(имя);
А потом добавить в нужное место.
Hr1zantema; +1 Ответить
8. Hr1zantema 31.05.26 16:15 Сейчас в теме
(6) Спасибо поучилось
3. Hr1zantema 31.05.26 12:46 Сейчас в теме
файлы приложить не могу - конфиденциальная информация в них.
Изменение только во второй строке

Было:
<?xml version="1.0" encoding="windows-1251"?>
<Файл xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ИдФайл="XXXX_0_0_0_0_0_00" ВерсФорм="5.03" ВерсПрог="Platform">

Стало:
<?xml version="1.0" encoding="windows-1251"?>
<Файл xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ИдФайл="XXXX_0_1_0_0_0_00" ВерсФорм="5.03" ВерсПрог="Platform">

не понятно почему обрезало и изменилось xmlns:xsi.
будет ли это влиять при загрузке
9. gml 01.06.26 13:09 Сейчас в теме
(3) Порядок указания пространств имен не важен. У Вас они просто поменялись местами. Всё должно работать.
Hr1zantema; +1 Ответить
10. Hr1zantema 01.06.26 13:33 Сейчас в теме
11. starik-2005 3274 01.06.26 13:35 Сейчас в теме
Зачем усложнять?
Текст = ПрочитатьТекст(ИмяФайла);
Текст = СтрЗаменить(Текст, "00_00_00_1", "01_00_00_1");
ЗаписатьТекст(Текст)
Anton_new01; +1 Ответить
12. Sashares 33 01.06.26 14:07 Сейчас в теме
(11) А вдруг там еще где-то такое значение в файле будет?)
13. starik-2005 3274 01.06.26 14:25 Сейчас в теме
(12)
А вдруг там
Регулярка спасет отцов и матерей иностранных легионов...
Catuser; user_2202820; Sashares; +3 Ответить
14. user_2202820 01.06.26 14:41 Сейчас в теме
(13)
Регулярка
Я, когда хочу избавится от вопрошаюшего, тоже так делаю. Он уходит и успешно взрывает себе мозг самостоятельно.
orakool2; Sashares; +2 Ответить
15. starik-2005 3274 01.06.26 16:01 Сейчас в теме
(14)
самостоятельно
Джимми на страже мозга.
Для отправки сообщения требуется регистрация/авторизация

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