Запись объекта XDTO в узел документа DOM

1. Darklight 34 14.02.24 11:08 Сейчас в теме
Всем добра. Возникла потребность обрабатывать документ XML через ДокументDOM - как читать так и писать (нужно провести анализ и модификацию некоторых существующих узлов). Нужно внести изменения в структуру узла - заменив её на новую путём записи туда значения "ОбъектXDTO" - но я что-то не смог понять как это сделать.
Вот у меня есть целевой узел типа "ЭлементDOM" (пусть это будет владелец, куда надо записать новый узел - так будет понятнее)
Вот у меня есть значение "ОбъектXDTO" которое надо записать в виде нового узла DOM в струкутре указанного узла-владельца.
И, вот, я никак не пойму как это сделать?

У объекта "ФабрикаXDTO" есть метод "ЗаписатьXML" который принимает такой вот аргумент, например, как тип "ЗаписьУзловDOM" в качестве провайдера записи. Но я никак не пойму как мне тогда его установить на целевой узел-владелец - в типе "ЗаписьУзловDOM" есть свойство "УзелDOM" но оно только для чтения, а конструктор принимает тип "ДокументDOM" - а мне нужен конкретный узел - или как раз мне нужно подавать в конструктор целевой узел как тип "ДокументDOM" (давно не работал в модели DOM - может эти типы взаимозаменяемы)?
То есть нужен "ЗаписьУзловDOM" уже спозиционированный на определённый узел, в который нужно писать - как его получить?

Или я что-то не так делаю, и нужно поступать по-другому?

Не хотелось бы последовательно перебирать весь документ xml через ЧтениеXML и ЗаписьXML когда надо просто точечно внести изменения!
Как и не хотелось бы вручную обрабатывать структуру объекта XDTO формируя узлы через методы ДокументDOM!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Darklight 34 14.02.24 13:48 Сейчас в теме
Вроде бы сам разобрался

Интерлюдия - некоторый код, создающий объект XDTO (к вопросу не относится)
Если ТипЗнч(Тип)=Тип("ТипЗначенияXDTO") Тогда
	знч = "";
	Если Тип.Фасеты<>неопределено Тогда
		знч = Тип.Фасеты.Получить(0).Значение;
	КонецЕсли;
	об = ФабрикаXDTO.Создать(Тип,знч); 
Иначе
	об = ФабрикаXDTO.Создать(Тип); 
КонецЕсли;                      
Показать

Далее "Узел" - узел приёмник, "Перед" - предыдущий узел (при обходе с конца) - всё это тоже напрямую к вопросу не относится

Такой код не рабочий
нУзел = Узел.ДокументВладелец.СоздатьЭлемент(URIПространстваИмен,ЛокальноеИмя);
Если Перед = неопределено Тогда
	Узел.ДобавитьДочерний(нУзел);
Иначе
	Узел.ВставитьПеред(нУзел, Перед);
КонецЕсли;
Запись = Новый ЗаписьУзловDOM();
Запись.Открыть(нУзел);
ФабрикаXDTO.ЗаписатьXML(запись, об);
Перед = нУзел
Показать

а вот такой - работает
Запись = Новый ЗаписьУзловDOM();
Запись.Открыть(Узел.ДокументВладелец);
ФабрикаXDTO.ЗаписатьXML(Запись, об, Имя, URIПространстваИмен);
нУзел = Запись.УзелDOM.ПоследнийДочерний;
Если Перед = неопределено Тогда
	Узел.ДобавитьДочерний(нУзел);
Иначе
	Узел.ВставитьПеред(нУзел, Перед);
КонецЕсли;
Перед = нУзел;
Показать

То есть через ЗаписьУзловDOM создаём новый узел (а не через Узел.ДокументВладелец.СоздатьЭлемент) - уже заполненный, а потом просто размещаем его в нужную позицию!
Sashares; +1 Ответить
Оставьте свое сообщение

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