Хочется делать следующее преобразование.
Имеем на входе некий произвольный XML. У меня, к примеру тот, что возвращает http://gw.edostavka.ru:11443/pvzlist.php или в явном виде:
Требуется получить из него обыкновенную таблицу значений.
Причем хочется обойтись одним каким-либо хитрым заклинанием :)
Кажется, это должны уметь объекты XDTO, но как?
...
Конечно можно бы было обойтись без XDTO и прописать все в явном виде:
...
тзПВЗ = Новый ТаблицаЗначений;
тзПВЗ.Колонки.Добавить("Название", Новый ОписаниеТипов("Строка"));
тзПВЗ.Колонки.Добавить("КодПВЗ", Новый ОписаниеТипов("Строка"));
тзПВЗ.Колонки.Добавить("Город", Новый ОписаниеТипов("Строка"));
тзПВЗ.Колонки.Добавить("Адрес", Новый ОписаниеТипов("Строка"));
тзПВЗ.Колонки.Добавить("КодГорода", Новый ОписаниеТипов("Строка"));
ЧтениеXMLДанных = Новый ЧтениеXML;
ЧтениеXMLДанных.УстановитьСтроку(СтрокаXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXMLДанных);
СписокПВЗ = ОбъектXDTO.ПолучитьСписок("Pvz");
Для каждого ПВЗ Из СписокПВЗ Цикл
стр = тзПВЗ.Добавить();
стр.Название = ПВЗ.Name;
стр.КодПВЗ = ПВЗ.Code;
стр.Город = ПВЗ.City;
стр.Адрес = ПВЗ.Address;
стр.КодГорода = ПВЗ.CityCode;
КонецЦикла;
Показать
Но хочется большего!
Ищу способ так прочитать XML, чтобы на выходе мне получилась таблица значений сразу, без каких бы то ни было циклов.
Понимаю, что надо каким-то образом использовать СериализаторXDTO.
Причем, способ "в лоб" не работает, конструкция
ЧтениеXMLДанных = Новый ЧтениеXML;
ЧтениеXMLДанных.УстановитьСтроку(СтрокаXML);
ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
таблицу значений не вернет, и это понятно, ведь 1С не понимает структуры входящего XML без дополнительных объяснений
Т.е нужно как-то описать схему XML, либо создать ПакетXDTO. Но как, какую структуру там задать?
Пока не могу ничего придумать, кроме как пойти еще одним обходным путем, а именно использовать ПреобразованиеXSL, преодразуя входящий XML в вид пригодный для понимания 1С в рамках ее пространств имен.
Мне это удалось следующим образом:
Преобразование_ПВЗ = Новый ПреобразованиеXSL;
Преобразование_ПВЗ.ЗагрузитьИзСтроки(Схема);
СтрокаXML_ПВЗ = Преобразование_ПВЗ.ПреобразоватьИзСтроки(СтрокаXML);
ЧтениеXML_ПВЗ = Новый ЧтениеXML();
ЧтениеXML_ПВЗ.УстановитьСтроку(СтрокаXML_ПВЗ);
ТЗ2 = СериализаторXDTO.ПрочитатьXML(ЧтениеXML_ПВЗ);
Работает успешно.
Код сократился.
Но весьма смущает то, что приходится входящий XML еще раз переписывать, прежде чем сериализовать.
Как обойтись без этого?
Как описать такой НаборСхемXML, на основании которого можно бы было создать ФабрикаXDTO, преобразующую входящий XML в ТаблицаЗначений сразу, в одно действие?
преобразование xml через другой xml это вообще за пределами
- почему же, если теперь в 1С есть объект ПреобразованиеXSL, который оказалось весьма удобно использовать для разных нужд в 1С (см. http://infostart.ru/public/352722/ и http://infostart.ru/public/347510/). С этим как раз проблем нет. Через правильно написанную схему XSL для ПреобразованиеXSL у меня ТаблицаЗначений успешно получается. Вопрос не в этом!
Вопрос в том, как то же самое сделать используя только механизм XDTO?
(5) Поручик, Читай внимательнее мой (1) заглавный вопрос. там как раз описано, как получить из одного XML другой XML, с иной структурой.
Мой вопрос в другом.
Как внешний XML сериализовать в объект ТаблицаЗначений?
Какой НаборСхемXML для этого нужно создать?
(7) Поручик,
да, вопрос именно в этом. Как создать XDTO-пакет, который преобразует мой XML в в объект ТаблицаЗначений?
Покажите мне хотя бы подходящий пример такого пакета
(1) tarassov, все правильно. либо вручную перенос реквизитов из объекта XDTO (со схемой/пакетом или без) в ТЗ, либо XSLT преобразование, и прямая десериализация через сериализатор XDTO.больше способов нет :)
(1) tarassov, XDTO ничего не преобразовывает. Если структура ХМЛ-файла соответствует схеме XDTO, то можно получить нужный объект, если нет, то нельзя. Если вы создаете свою схему, то и получить вы сможете свой объект.
Если структура ХМЛ-файла соответствует схеме XDTO, то можно получить нужный объект
В этом и вопрос - можно ли сделать такую схему XDTO, что бы ей с одной стороны соответствовала структура неизмененного ХМЛ-файла, а с другой - нужный объект 1С, в моем случае ТаблицаЗначений? И если можно, то как?
(18) tarassov, схема описывающая ТЗ уже есть. И если объект соответствует этой схеме, то это ТЗ, а если не соответствует, то это не ТЗ. Третьего не дано. Все что можно сделать это привести к нужному виду с помощью XSLT.
(3) ture, нет там никаких ошибок. У меня это место работает. Это ты скорее всего неточно скопировал, либо на сайт как-то кривовато выложилось. То есть это не проблема.
Я спрашивал не о XSL, а о XDTO
Граждане! У меня тут куча народу. Я сходил в соседний комната к людям, где звания выше.
Ну ботинком в меня не кинули за идею преобразований, но осадочек остался. Я так понимаю, вещь не тривиальная и плохо отлаживается, а ошибки можно искать неделями.
Рекомендовали писать прозрачный код на том языке, который мне знаком лучше и в коде делать требуемое, не полагаясь на схемы преобразования.
Рекомендовали писать прозрачный код на том языке, который мне знаком лучше и в коде делать требуемое, не полагаясь на схемы преобразования
- почему же так категорично?
Посмотри публикации у нас на тему преобразований. Мне вот очень понравилась идея (11) Fragster - http://infostart.ru/public/352812/
(15) tarassov, в случае моей обработки идет преобразование Структура 1с с данными + XML с шаблоном => тут заполнение шаблона через DOM + XPATH => результирующий XML.
В случае (0) - либо через XSLT: XML с данными + XML с правилами преобразования => XML по схеме сериализатора для ТЗ => ТЗ, либо через код: XML [+ схема] => Объект XDTO + код на языке 1с => ТЗ.
Имхо без спешки, без суеты, пройтись по хмл, и запихнуть все в ТЗ. Старый дедовский способ, проверенный годами на обменах. Не надо гнаться за универсальностью и красотой. Есть задача и результат ее выполнения. Получите результат.
(23) spezc,
Как получать результат, я сразу же описал во введении.
Меня интересует в данном случае именно теория (и немного красота).
Можно общий вопрос разбить на два подвопроса:
1. Как описать ПакетXDTO для таблицы значений с пятью строковыми колонками
2. Как сопоставить методами XDTO этому пакету XML иной структуры (Либо докажите, что это будет невозможно)
Забавно наблюдать, как люди, которые ничего не понимают в XML пытаются опрокинуть человека, который хоть что-то соображает в XSL. Уважаемый, дорогой автор, ты пошел правильным путем, не обращай внимание на тех, кто тебе рассказывает про пакеты XDTO. Ты прекрасно сможешь конвертнуть любую структуру ХМЛ в сериализованную ТаблицаЗначений через ПреобразованиеXSL, а затем прочитать ее в нативный 1С объект через СериализаторXDTO без применения рудиментов в виде XDTO. Не останавливайся на достигнутом: таким образом ты сможешь читать и более сложные объекты: например, структуру, одно свойство которой - массив со значениями, другое - соответствие со значениями, а третье - вообще ссылка на документ нужного тебе типа.
Все в твоих руках! Если тебе потребуется помощь, обращайся в скайп - поддержу. CagoBHuK_MATRIX.
Пробовал выполнять преобразования по указанному шаблону автора. Не знаю ошибка у него или нет, но обращение к элементам в цикле должно быть не через "@" а через "./"