Вход | Регистрация
 

Запись DOM в элемент XML

Запись DOM в элемент XML
Я
   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
 
 
   DrShad
 
1 - 05.06.18 - 15:20
для DOM нужен корневой элемент
   Tateossian
 
2 - 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;
...

Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует