Обход xml с помощью XDTO или другой способ
Добрый всем день! Помогите разобраться, я уже замучался.. Имеем вот такой XML:
Пытаюсь обойти с помощью XDTO:
В отладчике вижу что ходит по двум свойствам, а где УИД и Код ?
Я уже разными способами пробовал, кучу форумов облазил, я ворубушек... подталкните
В идеале я хочу эти объекты запихнуть в табличную часть формы... Может есть еще способы ? Хочу доставать объекты как-то так:
УИД = "31b9efb0-e910-11dc-b11e-0019d1e0b62b"
Код = "0000001"
Наименование = "Украинский"
ПометкаУдаления = "false"
<?xml version="1.0" encoding="UTF-8"?>
<ФайлОбмена ВерсияФормата="2.0" ДатаВыгрузки="2019-07-24T09:23:44" НачалоПериодаВыгрузки="0001-01-01T00:00:00" ОкончаниеПериодаВыгрузки="0001-01-01T00:00:00" ИмяКонфигурацииИсточника="ЗарплатаИУправлениеПерсоналомДляУк раины" ИмяКонфигурацииПриемника="ЗарплатаИУправлениеПерсоналомДляУк раины" ИдПравилКонвертации="714b94d7-0f73-47aa-84a7-554e17ff0f41" Комментарий="">
<ПравилаОбмена>
<ВерсияФормата>2.01</ВерсияФормата>
<Ид>714b94d7-0f73-47aa-84a7-554e17ff0f41</Ид>
<Наименование>ЗУП --> ЗУП</Наименование>
<ДатаВремяСоздания>2019-07-24T09:23:10</ДатаВремяСоздания>
<Источник>ЗарплатаИУправлениеПерсоналомДляУкраины</Источник>
<Приемник>ЗарплатаИУправлениеПерсоналомДляУкраины</Приемник>
<Параметры/>
<Обработки/>
<ПравилаКонвертацииОбъектов>
<Правило>
<Код>ЯзыкиНародовМира</Код>
<СинхронизироватьПоИдентификатору>true</СинхронизироватьПоИд ентификатору>
<Источник>СправочникСсылка.ЯзыкиНародовМира</Источник>
<Приемник>СправочникСсылка.ЯзыкиНародовМира</Приемник>
</Правило>
</ПравилаКонвертацииОбъектов>
<ПравилаОчисткиДанных/>
<Алгоритмы/>
<Запросы/>
</ПравилаОбмена>
<Объект Нпп="1" Тип="СправочникСсылка.ЯзыкиНародовМира" ИмяПравила="ЯзыкиНародовМира"><Ссылка Нпп="1">
<Свойство Имя="{УникальныйИдентификатор}" Тип="Строка">
<Значение>31b9efb0-e910-11dc-b11e-0019d1e0b62b</Значение>
</Свойство>
<Свойство Имя="Код" Тип="Строка">
<Значение>000000001</Значение>
</Свойство>
</Ссылка>
<Свойство Имя="Наименование" Тип="Строка">
<Значение>Украинский</Значение>
</Свойство>
<Свойство Имя="ПометкаУдаления" Тип="Булево">
<Значение>false</Значение>
</Свойство>
</Объект>
<Объект Нпп="2" Тип="СправочникСсылка.ЯзыкиНародовМира" ИмяПравила="ЯзыкиНародовМира"><Ссылка Нпп="2">
<Свойство Имя="{УникальныйИдентификатор}" Тип="Строка">
<Значение>31b9efb1-e910-11dc-b11e-0019d1e0b62b</Значение>
</Свойство>
<Свойство Имя="Код" Тип="Строка">
<Значение>000000002</Значение>
</Свойство>
</Ссылка>
<Свойство Имя="Наименование" Тип="Строка">
<Значение>Английский</Значение>
</Свойство>
<Свойство Имя="ПометкаУдаления" Тип="Булево">
<Значение>false</Значение>
</Свойство>
</Объект>
ПоказатьПытаюсь обойти с помощью XDTO:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Для Каждого Объект из ОбъектXDTO.Объект Цикл
Для Каждого Свойство из Объект.Свойство Цикл
КонецЦикла;
КонецЦикла;
ПоказатьВ отладчике вижу что ходит по двум свойствам, а где УИД и Код ?
Я уже разными способами пробовал, кучу форумов облазил, я ворубушек... подталкните
В идеале я хочу эти объекты запихнуть в табличную часть формы... Может есть еще способы ? Хочу доставать объекты как-то так:
УИД = "31b9efb0-e910-11dc-b11e-0019d1e0b62b"
Код = "0000001"
Наименование = "Украинский"
ПометкаУдаления = "false"
Прикрепленные файлы:
По теме из базы знаний
- XDTO - часть 3
- Разбор XML документа - почти все возможные способы
- Графическая схема. Управление при помощи XDTO.
- Синхронизация хранилища 1С и git-репозитория с применением OneScript и Gitsync. Методика и пошаговая инструкция для создания скрипта и его регулярного запуска
- Пример обмена данными через XDTO
Найденные решения
(13) Вообще рабочий вариант )
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Текст);
ПостроительDOM = Новый ПостроительDOM;
ДанныеDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
УзелКонтекста = ДанныеDOM.ПервыйДочерний;
Разыменователь = Новый РазыменовательПространствИменDOM(УзелКонтекста);
РезультатXPath = ДанныеDOM.ВычислитьВыражениеXPath("Объект[@Тип=""СправочникСсылка.ЯзыкиНародовМира""]", УзелКонтекста, Разыменователь);
Объект = РезультатXPath.ПолучитьСледующий();
Пока НЕ Объект = Неопределено Цикл
ГУИД = ДанныеDOM.ВычислитьВыражениеXPath("Ссылка/Свойство[@Имя = ""{УникальныйИдентификатор}""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
Код = ДанныеDOM.ВычислитьВыражениеXPath("Ссылка/Свойство[@Имя = ""Код""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
Наименование = ДанныеDOM.ВычислитьВыражениеXPath("Свойство[@Имя = ""Наименование""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
ПометкаУдаления = ДанныеDOM.ВычислитьВыражениеXPath("Свойство[@Имя = ""ПометкаУдаления""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
Сообщить(СтрШаблон("%1-%2-%3-%4", ГУИД, Код, Наименование, ПометкаУдаления));
Объект = РезультатXPath.ПолучитьСледующий();
КонецЦикла
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Для Каждого Объект из ОбъектXDTO.Объект Цикл
Для Каждого Свойство из Объект.Свойство Цикл
КонецЦикла;
КонецЦикла;
(1)
Я бы написал вот так лучше.
ОбъектXML = ОбъектXDTO.Объект;
Для каждого Свойства из ОбъектXML Цикл
НовСтр = ВашаТаб.Добавить;
Если Свойство.Имя = "{УникальныйИдентификатор}" Тогда
НовСтр.УИД = Свойство.Значение;
КонецЕСли;
КонецЦикла;
По вашей структуре вроде все именно так должно быть.
Чтение.ОткрытьФайл(ФайлXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Для Каждого Объект из ОбъектXDTO.Объект Цикл
Для Каждого Свойство из Объект.Свойство Цикл
КонецЦикла;
КонецЦикла;
(1)
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Для Каждого Объект из ОбъектXDTO.Объект Цикл
Для Каждого Свойство из Объект.Свойство Цикл
КонецЦикла;
КонецЦикла;
Чтение.ОткрытьФайл(ФайлXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Для Каждого Объект из ОбъектXDTO.Объект Цикл
Для Каждого Свойство из Объект.Свойство Цикл
КонецЦикла;
КонецЦикла;
Я бы написал вот так лучше.
ОбъектXML = ОбъектXDTO.Объект;
Для каждого Свойства из ОбъектXML Цикл
НовСтр = ВашаТаб.Добавить;
Если Свойство.Имя = "{УникальныйИдентификатор}" Тогда
НовСтр.УИД = Свойство.Значение;
КонецЕСли;
КонецЦикла;
По вашей структуре вроде все именно так должно быть.
(7)Ну как то так, проще у тебя не получится, у тебя потому что все пишется под одним атрубитом, ну можешь пробовать.
Прикрепленные файлы:
тест.epf
Данные.xml
(1)
Я бы наверно как то так сделал
Я бы наверно как то так сделал
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ПолеВвода1);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Для Каждого Объект из ОбъектXDTO.Объект Цикл
Код = "";
УИД = "";
Наименование = "";
Для Каждого СвойствоСсылки из Объект.Ссылка.Свойство Цикл
Если СвойствоСсылки.Имя = "{УникальныйИдентификатор}" Тогда
УИД = СвойствоСсылки.Значение;
КонецЕсли;
Если СвойствоСсылки.Имя = "Код" Тогда
Код = СвойствоСсылки.Значение;
КонецЕсли;
КонецЦикла;
Для Каждого СвойствоОбъекта из Объект.Свойство Цикл
Если СвойствоОбъекта.Имя = "Наименование" Тогда
Наименование = СвойствоОбъекта.Значение;
КонецЕсли;
Если СвойствоОбъекта.Имя = "ПометкаУдаления" Тогда
ПометкаУдаления = XMLЗначение(Тип("Булево"), СвойствоОбъекта.Значение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Показать
"Текст" замени на свой XML. Жесткий вариант конечно.
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Текст);
ПостроительDOM = Новый ПостроительDOM;
ДанныеDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
УзелКонтекста = ДанныеDOM.ПервыйДочерний;
Разыменователь = Новый РазыменовательПространствИменDOM(УзелКонтекста);
РезультатXPath = ДанныеDOM.ВычислитьВыражениеXPath("Объект", УзелКонтекста, Разыменователь);
Объект = РезультатXPath.ПолучитьСледующий();
Пока НЕ Объект = Неопределено Цикл
Для Каждого ДочернийУзел Из Объект.ДочерниеУзлы Цикл
Сообщить(СтрШаблон("%1-%2", ДочернийУзел.Атрибуты[0].ТекстовоеСодержимое, ДочернийУзел.ТекстовоеСодержимое));
КонецЦикла;
Объект = РезультатXPath.ПолучитьСледующий();
КонецЦикла
ПоказатьПрикрепленные файлы:
(8) в переменной текст должен быть текст твоего XML.
я подставлял
я подставлял
<?xml version="1.0" encoding="UTF-8"?>
<ФайлОбмена ВерсияФормата="2.0" ДатаВыгрузки="2019-07-24T09:23:44" НачалоПериодаВыгрузки="0001-01-01T00:00:00" ОкончаниеПериодаВыгрузки="0001-01-01T00:00:00" ИмяКонфигурацииИсточника="ЗарплатаИУправлениеПерсоналомДляУк раины" ИмяКонфигурацииПриемника="ЗарплатаИУправлениеПерсоналомДляУк раины" ИдПравилКонвертации="714b94d7-0f73-47aa-84a7-554e17ff0f41" Комментарий="">
<ПравилаОбмена>
<ВерсияФормата>2.01</ВерсияФормата>
<Ид>714b94d7-0f73-47aa-84a7-554e17ff0f41</Ид>
<Наименование>ЗУП --> ЗУП</Наименование>
<ДатаВремяСоздания>2019-07-24T09:23:10</ДатаВремяСоздания>
<Источник>ЗарплатаИУправлениеПерсоналомДляУкраины</Источник>
<Приемник>ЗарплатаИУправлениеПерсоналомДляУкраины</Приемник>
<Параметры/>
<Обработки/>
<ПравилаКонвертацииОбъектов>
<Правило>
<Код>ЯзыкиНародовМира</Код>
<СинхронизироватьПоИдентификатору>true</СинхронизироватьПоИд ентификатору>
<Источник>СправочникСсылка.ЯзыкиНародовМира</Источник>
<Приемник>СправочникСсылка.ЯзыкиНародовМира</Приемник>
</Правило>
</ПравилаКонвертацииОбъектов>
<ПравилаОчисткиДанных/>
<Алгоритмы/>
<Запросы/>
</ПравилаОбмена>
<Объект Нпп="1" Тип="СправочникСсылка.ЯзыкиНародовМира" ИмяПравила="ЯзыкиНародовМира"><Ссылка Нпп="1">
<Свойство Имя="{УникальныйИдентификатор}" Тип="Строка">
<Значение>31b9efb0-e910-11dc-b11e-0019d1e0b62b</Значение>
</Свойство>
<Свойство Имя="Код" Тип="Строка">
<Значение>000000001</Значение>
</Свойство>
</Ссылка>
<Свойство Имя="Наименование" Тип="Строка">
<Значение>Украинский</Значение>
</Свойство>
<Свойство Имя="ПометкаУдаления" Тип="Булево">
<Значение>false</Значение>
</Свойство>
</Объект>
<Объект Нпп="2" Тип="СправочникСсылка.ЯзыкиНародовМира" ИмяПравила="ЯзыкиНародовМира"><Ссылка Нпп="2">
<Свойство Имя="{УникальныйИдентификатор}" Тип="Строка">
<Значение>31b9efb1-e910-11dc-b11e-0019d1e0b62b</Значение>
</Свойство>
<Свойство Имя="Код" Тип="Строка">
<Значение>000000002</Значение>
</Свойство>
</Ссылка>
<Свойство Имя="Наименование" Тип="Строка">
<Значение>Английский</Значение>
</Свойство>
<Свойство Имя="ПометкаУдаления" Тип="Булево">
<Значение>false</Значение>
</Свойство>
</Объект>
</ФайлОбмена>
Показать
(5) Интересная, но что-то я делаю не так, В примере как делал я, и выше посоветовал человек, Читает только Нименование и Пометку. В вашем примере получается читает УИД,Наименование,Пометка. А где "Код"?))) Я вот пытаюсь читать про Xpath, интересно, но сложно... За наводку спасибо!
(13) Вообще рабочий вариант )
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Текст);
ПостроительDOM = Новый ПостроительDOM;
ДанныеDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
УзелКонтекста = ДанныеDOM.ПервыйДочерний;
Разыменователь = Новый РазыменовательПространствИменDOM(УзелКонтекста);
РезультатXPath = ДанныеDOM.ВычислитьВыражениеXPath("Объект[@Тип=""СправочникСсылка.ЯзыкиНародовМира""]", УзелКонтекста, Разыменователь);
Объект = РезультатXPath.ПолучитьСледующий();
Пока НЕ Объект = Неопределено Цикл
ГУИД = ДанныеDOM.ВычислитьВыражениеXPath("Ссылка/Свойство[@Имя = ""{УникальныйИдентификатор}""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
Код = ДанныеDOM.ВычислитьВыражениеXPath("Ссылка/Свойство[@Имя = ""Код""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
Наименование = ДанныеDOM.ВычислитьВыражениеXPath("Свойство[@Имя = ""Наименование""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
ПометкаУдаления = ДанныеDOM.ВычислитьВыражениеXPath("Свойство[@Имя = ""ПометкаУдаления""]/Значение", Объект, Разыменователь).ПолучитьСледующий().ТекстовоеСодержимое;
Сообщить(СтрШаблон("%1-%2-%3-%4", ГУИД, Код, Наименование, ПометкаУдаления));
Объект = РезультатXPath.ПолучитьСледующий();
КонецЦикла
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот