Имя: Пароль:
1C
 
Запись DOM в элемент XML
0 Tateossian
 
05.06.18
14:29
Всем привет! Есть такой кусок кода:

Поток = Новый ПотокВПамяти;

Запись = Новый ЗаписьXML;            
Запись.ОткрытьПоток(Поток, "UTF-8", Ложь);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("_1CV8DtUD", "http://www.1c.ru/V8/1CV8DtUD/";);
Запись.ЗаписатьСоответствиеПространстваИмен("V8Exch", "http://www.1c.ru/V8/1CV8DtUD/";);
Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
Запись.ЗаписатьСоответствиеПространстваИмен("v8",  "http://v8.1c.ru/data";);
Запись.ЗаписатьНачалоЭлемента("V8Exch:Data");

Это из типовой обработки выгрузки-загрузки данных. Задача в том, чтобы в Элемент <V8Exch:Data> записать целиком DOM, который представляет собой сериализованный объект CatalogObject или DocumentObject.

Как это можно сделать кратчайшим способом, чтобы не обходить все дочерние узлы рекурсивно? Вот так не дает:

    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЭлементМассива);
    СтрокаXML = ЗаписьXML.Закрыть();
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    
    ПостроительDOM = Новый ПостроительDOM;    
    ДокументDOMШаблон = ПостроительDOM.Прочитать(ЧтениеXML);
        
    ЗаписьDOM = Новый ЗаписьDOM;
    ЗаписьDOM.Записать(ДокументDOMШаблон, Запись); --> Ошибка при вызове метода контекста (Записать): Ошибочный порядок записи XML
1 DrShad
 
05.06.18
15:20
для DOM нужен корневой элемент
2 Tateossian
 
05.06.18
18:57
Проблема решена. Для потомков:

Выборка = ПланыОбмена.ВыбратьИзменения(Узел, 0);

МассивОбъектов = Новый Массив;

Пока Выборка.Следующий() Цикл
    
    МассивОбъектов.Добавить(Выборка.Получить());
    
КонецЦикла;

Поток = Новый ПотокВПамяти;

Запись = Новый ЗаписьXML;            
Запись.ОткрытьПоток(Поток, "UTF-8", Ложь);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("_1CV8DtUD", "http://www.1c.ru/V8/1CV8DtUD/";);
Запись.ЗаписатьСоответствиеПространстваИмен("V8Exch", "http://www.1c.ru/V8/1CV8DtUD/";);
Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
Запись.ЗаписатьСоответствиеПространстваИмен("v8",  "http://v8.1c.ru/data";);
Запись.ЗаписатьНачалоЭлемента("V8Exch:Data");

Конвертор = Новый ПреобразованиеККаноническомуXML;

Для Каждого ЭлементМассива Из МассивОбъектов Цикл
    
    Если Не ТипЗнч(ЭлементМассива) = Тип("ДокументОбъект.ЗаказПокупателя") Тогда
        Продолжить;
    КонецЕсли;
    
    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЭлементМассива);
    СтрокаXML = ЗаписьXML.Закрыть();
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(СтрокаXML);
    
    ПостроительDOM = Новый ПостроительDOM;    
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    
        // дополнительные данные, которых нет в сериализуемом (стандартно) объекте
    ВесБрутто = МодульДоработокСервер.РассчитатьВесВДокументеБруттоИтого(Неопределено, Неопределено, ЭлементМассива);
    ЭлементDOM  = ДокументDOM.СоздатьЭлемент("ВесБрутто");
    ЭлементDOM.ТекстовоеСодержимое = XMLСтрока(ВесБрутто);
    ДокументDOM.ЭлементДокумента.ДобавитьДочерний(ЭлементDOM);
    
    СтрокаПотокаШаблона = Конвертор.КанонизироватьВСтроку(ДокументDOM);
            
    Запись.ЗаписатьБезОбработки(СтрокаПотокаШаблона);
    
КонецЦикла;

Запись.ЗаписатьКонецЭлемента(); //V8Exc:Data
Запись.ЗаписатьКонецЭлемента(); //V8Exc:_1CV8DtUD
Запись.Закрыть();

СтрокаРезультат = ПолучитьСтрокуИзДвоичныхДанных(Поток.ЗакрытьИПолучитьДвоичныеДанные(), "UTF-8");

ПреобразованиеXSL = Новый ПреобразованиеXSL;
...
AdBlock убивает бесплатный контент. 1Сергей