Загрузка через СериализаторXDTO

1. VslavKup 32 10.10.19 01:13 Сейчас в теме
Добрый день.
Есть файл XML со структурой,соответствующей фабрике XDTO.
В конфигурации получателя разместил эту схему и пытаюсь разобрать файл загрузки при помощи сериализатора, связанного с этой фабрикой.
При этом не сериализатор по какой то причине не производит чтение файла загрузки. Метод ВозможностьЧтенияXML(ЧтениеХМЛ) возвращает ЛОЖЬ.

	////////////////////////////////////////////////////////////­///
	// СОЗДАНИЕ ФАБРИКИ НА ОСНОВЕ СХЕМЫ  "http://localhost/MyExportData"
	//
	
	НаборСхемФабрик = ФабрикаXDTO.ЭкспортСхемыXML("http://localhost/MyExportData");
	Схема = НаборСхемФабрик.Получить(0);
	
	Схема.ОбновитьЭлементDOM();
	
	ПутьКФабрике = ПолучитьИмяВременногоФайла("xsd");
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ПутьКФабрике);
	ЗаписьDOM = Новый ЗаписьDOM;
	ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXML);
	ЗаписьXML.Закрыть();
	
	ФабрикаПолучателя = СоздатьФабрикуXDTO(ПутьКФабрике);
	
	
	ТекСериализатор = Новый СериализаторXDTO(ФабрикаПолучателя);
	
	ЧтениеХМЛ = Новый ЧтениеXML;
	ЧтениеХМЛ.ОткрытьФайл(ИмяФайлаЗагрузки);
	ЧтениеХМЛ.Прочитать(); // Чтение коревого узла
	
	Пока ТекСериализатор.ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
	    Тип_РасходТовара = ФабрикаXDTO.Тип("http://localhost/MyExportData", "РасходТовара");
		ТекОбъект = ТекСериализатор.ПрочитатьXML(ЧтениеХМЛ, Тип_РасходТовара);
	КонецЦикла;
Показать


При помощи другой методики этот файл нормально читается в получателе

НаборСхемФабрик = ФабрикаXDTO.ЭкспортСхемыXML("http://localhost/MyExportData");
		Схема = НаборСхемФабрик.Получить(0);
		
		Схема.ОбновитьЭлементDOM();
		
		ПутьКФабрике = ПолучитьИмяВременногоФайла("xsd");
		
		ЗаписьXML = Новый ЗаписьXML;
		ЗаписьXML.ОткрытьФайл(ПутьКФабрике);
		ЗаписьDOM = Новый ЗаписьDOM;
		ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXML);
		ЗаписьXML.Закрыть();
		
		ФабрикаПолучателя = СоздатьФабрикуXDTO(ПутьКФабрике);
		Тип_РасходТовара = ФабрикаXDTO.Тип("http://localhost/MyExportData", "РасходТовара");
		
		ДанныеXDTO = ФабрикаПолучателя.ПрочитатьXML(ЧтениеХМЛ, Тип_РасходТовара); // В этой переменой нормально формируется список содержимого файла
Показать


Возможно ли вообще использовать объект Сериализатор с выбранной фабрикой XDTO для чтения файла XML?
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
16. VslavKup 32 12.10.19 17:49 Сейчас в теме +1 $m
Вопрос не решаемый. Буду делать по варианту с глобальной фабрикой без указания типа объекта. Так точно работает. Тема закрыта.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 81 10.10.19 06:17 Сейчас в теме
(1) Если не делать ЧтениеХМЛ.Прочитать(); то же самое?
9. Sashares 33 10.10.19 11:08 Сейчас в теме
(1)У вас файл начинается с узла ExportData. Такого узла нет в пакете XDTO. Поэтому не читает.
Надо либо создать такой объект в пакете, либо чтением xml дочитать до узла РасходТовара, потом читать этот объект.
Пример чтения объекта XDTO фабрикой.

ТекОбъектXDTO= ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(URIПакета, ИмяОбъекта));
13. wertep 32 10.10.19 17:30 Сейчас в теме
(1) Зачем городить огород с отдельной фабрикой, у вас ПакетXDTO уже в составе конфигурации, поэтому пробуем сначала так:
    ТекСериализатор = Новый СериализаторXDTO(ФабрикаПолучателя);
    
    ЧтениеХМЛ = Новый ЧтениеXML;
    ЧтениеХМЛ.ОткрытьФайл(ИмяФайлаЗагрузки);
    ЧтениеХМЛ.Прочитать(); // Чтение коревого узла
    
    Пока ТекСериализатор.ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
        Тип_РасходТовара = ФабрикаXDTO.Тип("http://localhost/MyExportData", "РасходТовара");
        ТекОбъект = ТекСериализатор.ПрочитатьXML(ЧтениеХМЛ, Тип_РасходТовара);
    КонецЦикла;
Показать
14. dhurricane 11.10.19 08:27 Сейчас в теме
(13) Догадываюсь, что огород с отдельной фабрикой задумывается для конфигурации, где не будет соответствующего пакета XDTO. Т.е. вместе с данными будет отправляться и их структура, о которой приемнику ничего не известно.

Ну и я попробую у Вас спросить, для собственного образования. Какое значение ожидается в переменной "ТекОбъект"? Какого типа?
15. wertep 32 11.10.19 09:47 Сейчас в теме
(14)Честно говоря я и сам пока плохо понимаю зачем топикстартеру тут сериализатор, потому как он по идее должен преобразовать это все в объект конфигурации или встроенного языка. Но я сомневаюсь что есть какое-то соответствие, и именно поэтому ему сериализатор возвращает ложь. И как не извращайся можно получить только ОбъектXDTO. А дальше "врукопашную".
3. VslavKup 32 10.10.19 06:22 Сейчас в теме
И так проверял. Не распознается файл.
4. dhurricane 10.10.19 07:37 Сейчас в теме
(3) А попробуйте предварительно дважды прочитать. Т.е. и корневой элемент, и начало узла для сериализованного объекта.
5. VslavKup 32 10.10.19 07:49 Сейчас в теме
Проверял такую возможность. Вероятней всего нужно в самой схеме XDTO какие-то опции правильно выставить или в XML-файле атрибуты. Подробного описания не могу найти.
6. dhurricane 10.10.19 07:55 Сейчас в теме
(5) В документации к платформе попробуйте посмотреть. Вроде довольно подробно расписано.

Если ничего не выйдет, тогда выкладывайте xsd-схему и сам файл с данными. Будем смотреть.
7. VslavKup 32 10.10.19 08:34 Сейчас в теме
Выложил базу в которой фабрика и алгоритм.
Прикрепленные файлы:
ЧтениеФайлаХМЛ.dt
ФайлЗагрузкиЧеразXDTO.xml
8. dhurricane 10.10.19 10:58 Сейчас в теме
(7) Как-то я ввязался в тему, в которой мало что понимаю. Заранее извините.

В синтакс-помощнике к методу "ПрочитатьXML" сериализатора я прочитал следующее:
Прочитаны могут значения тех типов, которые могут быть записаны методом ЗаписатьXML.
В описании метода "ЗаписатьXML":
Тип параметра определяется совокупностью типов, для которых определена XML-сериализация.
Я эти строчки понимаю так: записываются и читаются лишь те объекты встроенного языка, для которых в синтакс-помощнике есть указание "Сериализуется".

Скажите, пожалуйста, а чем Вам не понравилось читать файл с использованием фабрики? И что Вы ожидаете получить в результате чтения сериализатором (какое значение, какого типа)?
10. VslavKup 32 10.10.19 11:28 Сейчас в теме
При чтении и использованием фабрики нужно производить несколько сравнений по условиям.

При чтении через сериализатор этого делать не нужно
	
// Здесь должен формироваться объект по значению в узле файла 
		ТекОбъект = ТекСериализатор.ПрочитатьXML(ЧтениеХМЛ, Тип_РасходТовара);
11. Sashares 33 10.10.19 11:44 Сейчас в теме
(10) Как понимаю, сериализатор читает в объект заданного типа. Если переданный xml содержит что-то лишнее, он не прочитает. Поэтому подозреваю он не прочитает как фабрика в список объектов.
12. VslavKup 32 10.10.19 13:00 Сейчас в теме
Файл с таким содержимым тоже не читается:

<РасходТовара xmlns="http://localhost/MyExportData" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Идентификатор>609501d6-e901-11e9-8820-a12dc67ef782</Идентификатор>
<НомерДок>000000001</НомерДок>
<ДатаДок>2019-10-07T00:00:00</ДатаДок>
<Контрагент>Мраморгранит</Контрагент>
<Состав>
<Товар>Товар 1</Товар>
<Количество>10</Количество>
</Состав>
<Состав>
<Товар>Товар 4</Товар>
<Количество>100</Количество>
</Состав>
</РасходТовара>
16. VslavKup 32 12.10.19 17:49 Сейчас в теме +1 $m
Вопрос не решаемый. Буду делать по варианту с глобальной фабрикой без указания типа объекта. Так точно работает. Тема закрыта.
Оставьте свое сообщение

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