Обход xml с помощью XDTO или другой способ

1. bitocheg 24.07.19 14:04 Сейчас в теме
Добрый всем день! Помогите разобраться, я уже замучался.. Имеем вот такой 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</Значение>
	</Свойство>
</Объект>
Показать


Пытаюсь обойти с помощью XDTO:
	Чтение = Новый ЧтениеXML;
	Чтение.ОткрытьФайл(ФайлXML);
	ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
	
	Для Каждого Объект из ОбъектXDTO.Объект Цикл
		Для Каждого Свойство из Объект.Свойство Цикл
			
		КонецЦикла;
	
		
	КонецЦикла;
Показать


В отладчике вижу что ходит по двум свойствам, а где УИД и Код ?

Я уже разными способами пробовал, кучу форумов облазил, я ворубушек... подталкните

В идеале я хочу эти объекты запихнуть в табличную часть формы... Может есть еще способы ? Хочу доставать объекты как-то так:

УИД = "31b9efb0-e910-11dc-b11e-0019d1e0b62b"
Код = "0000001"
Наименование = "Украинский"
ПометкаУдаления = "false"
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
16. chipazawra 24.07.19 16:26 Сейчас в теме
(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 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Alex_241 24.07.19 14:21 Сейчас в теме
(1) Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);

Для Каждого Объект из ОбъектXDTO.Объект Цикл
Для Каждого Свойство из Объект.Свойство Цикл

КонецЦикла;


КонецЦикла;
(1)
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);

Для Каждого Объект из ОбъектXDTO.Объект Цикл
Для Каждого Свойство из Объект.Свойство Цикл

КонецЦикла;


КонецЦикла;


Я бы написал вот так лучше.
ОбъектXML = ОбъектXDTO.Объект;

Для каждого Свойства из ОбъектXML Цикл

НовСтр = ВашаТаб.Добавить;
Если Свойство.Имя = "{УникальныйИдентификатор}" Тогда
НовСтр.УИД = Свойство.Значение;
КонецЕСли;

КонецЦикла;

По вашей структуре вроде все именно так должно быть.
3. bitocheg 24.07.19 14:33 Сейчас в теме
(2) Вот так...

Вроде задача элементарная...
Прикрепленные файлы:
6. Alex_241 24.07.19 15:10 Сейчас в теме
(3)Если сбросишь свой xml могу посмотреть и написать прям рабочий вариант
7. bitocheg 24.07.19 15:11 Сейчас в теме
(6) Если можно, хочется посмотреть более простой вариант...
Прикрепленные файлы:
Данные.xml
11. Alex_241 24.07.19 15:41 Сейчас в теме
(7)Ну как то так, проще у тебя не получится, у тебя потому что все пишется под одним атрубитом, ну можешь пробовать.
Прикрепленные файлы:
тест.epf
Данные.xml
12. bitocheg 24.07.19 15:56 Сейчас в теме
(11) Я так делал, у меня вопрос почему он читает Наименование и Пометку, а Код и УИД не читает.... ???
15. tjurikov_ivan 213 24.07.19 16:22 Сейчас в теме
(1)
Я бы наверно как то так сделал
Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ПолеВвода1);
    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
    
    Для Каждого Объект из ОбъектXDTO.Объект Цикл
		
		Код = "";
		УИД = "";
		Наименование = "";
		
		Для Каждого СвойствоСсылки из Объект.Ссылка.Свойство Цикл
			Если СвойствоСсылки.Имя = "{УникальныйИдентификатор}" Тогда
				УИД = СвойствоСсылки.Значение;
			КонецЕсли;
			Если СвойствоСсылки.Имя = "Код" Тогда
				Код = СвойствоСсылки.Значение;
			КонецЕсли;
		КонецЦикла;
	
	
		Для Каждого СвойствоОбъекта из Объект.Свойство Цикл
			Если СвойствоОбъекта.Имя = "Наименование" Тогда
				Наименование = СвойствоОбъекта.Значение;
			КонецЕсли;
			Если СвойствоОбъекта.Имя = "ПометкаУдаления" Тогда
				ПометкаУдаления = XMLЗначение(Тип("Булево"), СвойствоОбъекта.Значение);
			КонецЕсли;
		КонецЦикла;
	 КонецЦикла;
Показать
18. bitocheg 24.07.19 16:48 Сейчас в теме
(15) Спасибо! Этот вариант тоже рабочий! Был близок к такому решению, но видать мой скудный ум не додумался до такого... Спасибо за ответ
4. chipazawra 24.07.19 14:54 Сейчас в теме
"Текст" замени на свой XML. Жесткий вариант конечно.

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Текст);
ПостроительDOM = Новый ПостроительDOM;
ДанныеDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();

УзелКонтекста = ДанныеDOM.ПервыйДочерний;
Разыменователь = Новый РазыменовательПространствИменDOM(УзелКонтекста);

РезультатXPath = ДанныеDOM.ВычислитьВыражениеXPath("Объект", УзелКонтекста, Разыменователь);

Объект = РезультатXPath.ПолучитьСледующий();
Пока НЕ Объект = Неопределено Цикл 
	Для Каждого ДочернийУзел Из Объект.ДочерниеУзлы Цикл 
		Сообщить(СтрШаблон("%1-%2", ДочернийУзел.Атрибуты[0].ТекстовоеСодержимое, ДочернийУзел.ТекстовоеСодержимое));
	КонецЦикла;
	Объект = РезультатXPath.ПолучитьСледующий();
КонецЦикла

Показать
Прикрепленные файлы:
8. bitocheg 24.07.19 15:13 Сейчас в теме
(4) Пытаюсь запустить ваш вариант.. Сыпется на
Прикрепленные файлы:
10. chipazawra 24.07.19 15:16 Сейчас в теме
(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</Значение>
    </Свойство>
</Объект>
</ФайлОбмена>
Показать
9. bitocheg 24.07.19 15:16 Сейчас в теме
(4) Извините разобрался, забыл открыть файл... Пытаюсь разобраться, но уже вижу что работает почти как нужно. Но что-то внутри мне подсказывает, что есть более простой вариант решения такой задачи.... :) Большое спасибо за ответ
5. chipazawra 24.07.19 14:57 Сейчас в теме
а так xPath очень интересная штука.
13. bitocheg 24.07.19 15:58 Сейчас в теме
(5) Интересная, но что-то я делаю не так, В примере как делал я, и выше посоветовал человек, Читает только Нименование и Пометку. В вашем примере получается читает УИД,Наименование,Пометка. А где "Код"?))) Я вот пытаюсь читать про Xpath, интересно, но сложно... За наводку спасибо!
14. chipazawra 24.07.19 16:08 Сейчас в теме
(13) Извиняюсь, ошибка в алгоритме.
ГУИД слился с кодом 31b9efb1-e910-11dc-b11e-0019d1e0b62b000000002
т.к. код вложен в ссылку.
Нужно еще в ссылку залезать чтобы его вытащить.
16. chipazawra 24.07.19 16:26 Сейчас в теме
(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 Ответить
17. bitocheg 24.07.19 16:40 Сейчас в теме
(16) ВЫ ГЕНИЙ!:) Большое спасибо! Буду изучать XPath! Это же я таким способом смогу разобрать XML любой сложности! Еще раз большое человеческое спасибо!
Оставьте свое сообщение

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