gifts2017

Пророк в своем отечестве или Читаем XML с помощью XDTO

Опубликовал majmyl Hauanov (majmyl) в раздел Программирование - Теория программирования

Проходи, садись поудобнее и приготовься внимать мне. Сейчас я предскажу твое будущее… В этом пакете я описываю схему XML… Вы можете видеть, что код очень прост, и никакого преобразования элементов прочитанного XML не требуется…

Здесь, знаешь ли, приходится бежать со всех ног, чтобы только остаться на том же месте! Если же хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! (Королева «Алиса в зазеркалье»)

Доброго тебе дня, мой Дорогой Читатель! Проходи, садись поудобнее и приготовься внимать мне. Сейчас я предскажу твое будущее (свет меркнет, громы-молнии, звучит тревожная музыка)! Слушай же мой Читатель, что тебя ждет. Тебе рано или поздно придется столкнуться с XML (яркая молния, оглушительный грохот грома, запах озона).
Если ты разработчик 1С или пишешь на PHP, или С++, неважно, но рано или поздно тебе придется столкнуться с XML. Почему? Потому что это универсально, удобно, повсеместно, модно, круто, кросс-платформенно. XML правильно понимает и Android и Windows и Linux и все. Его используют для обмена информацией (например: электронные отчеты в налоговую, между конфигурациями 1С, для синхронизации с интернет-магазином). Его используют для хранения информации.
Итак, без долгих прелюдий приступим сразу к телу делу. Здесь не будет долгих описаний и определений. Просто несколько примеров. Но если вы собираетесь плотно работать с XML, то настоятельно рекомендую не полениться и почитать про XML и схемы XML (открывайте в Google Chrome, Firefox не совсем корректно работает с этим сайтом). Времени потратите не так много, а жизнь себе облегчите неимоверно.

Проблемой чтения/записи XML я столкнулся в связи с интеграцией с 1С корпоративных сайтов различных фирм, а именно, заказчики хотели чтобы кое-какая информация из 1С попадала на сайт и наоборот, и делалось это с некоторой периодичностью. Обычно это были продажи (информация для менеджеров), заказы (для дилеров) и различные примочки вроде журнала заявок, задач, отчетов и т.д.

СЛУЧАЙ I

Давайте предположим такую задачу, пусть на сайте некоего учебного заведения регистрируются студенты (не важно для чего, может чтобы пройти тестирование, а может чтобы талоны для столовой получить) и захотело руководство, чтобы эти данные попали в 1С в справочник «Студенты» (конфигурация «Учебное заведение 5.5 :-)  ). Программист PHP сказал «Бу сделано!» и выдал такой XML файл:

 

Здесь корневым элементов является элемент «students». Вложенным элементом является «student», где указана основная информация про студента учебного заведения. Элементы «name», «last_name», «sex» имеют тип «Строка», «birth» — «Дата», «level» (курс обучения) — «Число», «this_leader» (это староста группы) — «Булево». Нужно эти данные прочитать и разместить в справочнике «Студенты».

Как прочитать? Можно с помощью объекта «ЧтениеXML», но тогда нужно будет построчно обрабатывать документ. И хорошо если уровней вложенности всего лишь 2-3. А если их 10, и строк 10 тысяч? Тогда можно обработать с помощью «ДокументDOM», который создаст нам некое древовидное представление документа XML. Но тогда нам нужно будет каждый элемент обрабатывать отдельно, нужно будет программно прописывать, какой элемент преобразовывать в какой тип. Это не наш метод. Мой дорогой Читатель конечно же ознакомился с ссылками вверху и имеет представление об XML и его схемах. Давайте же создадим пакет XTDO и прочитаем с его помощью наш XML файл. Для этого я создал новую конфигурацию со следующими объектами:


Создал пакет XDTO «Чтение»:

 

Определил пространство имен «http://localhost/xdto». Если вы читали про XML и его схемы (ссылка выше) вы должны иметь представление, что такое пространство имен. А если не читали, то это некая уникальная интернет-ссылка (а интернет-ссылки все должны быть уникальными), где я определяю свои типы данных. Т. е. в пространстве имен (URI) »http://localhost/xdto» я определил тип students, который состоит из свойства student, который в свою очередь является сложным объектом и имеет свои свойства. А наф… зачем URI? Да затем, вдруг какой-нибудь чудак тоже определит тип students, что тогда? Конфликт? Разборки? Нет, у него будет другое пространство имен, например »http://tchudakov.net/blablabla». По хорошему, по адресу »http://localhost/xdto» у меня должно быть документация, информация, намек на то, что за схему я описал. Какие типы данных у меня, какие свойства. Мануал, одним словом. Но у меня там ничего нет. И у многих тоже ничего нет. Но Вы, мой дорогой Читатель, не берите пример с меня и таких как я. Если проект серьезный, сделайте документацию и потомки будут вам благодарны.

В этом пакете я описываю схему XML, т. е. это редактор, инструмент для создания схем. Вы даже можете нажать правой кнопкой мыши на пакет и экспортировать схему (файл с расширением .xsd). Для свойств я также указал типы: name, last_name, sex имеют тип string (http://www.w3.org/2001/XMLSchema). Как видите, тип string тоже определен в некоем пространстве имен, а именно его определяли сообща, на конференции w3 создавали стандарт. Свойство birth имеет тип date (http://www.w3.org/2001/XMLSchema), level - integer (http://www.w3.org/2001/XMLSchema),  this_leader - boolean (http://www.w3.org/2001/XMLSchema). Как это сделано вы можете посмотреть развернув у себя выгрузку данной конфигурации (ссылка в конце статьи).

Эту же схему можно описать вот так:

А теперь найди 7 отличий. Шучу, отличие только одно, я создал тип type_student и для свойства student определил тип (см. рисунок выше, если слишком мелко, жмакните на него). Это называется явным определением типа. А до этого мы занимались неявным определением типа. Во как! А теперь давайте прочитаем XML и создадим элементы справочника. Для этого я создал обработку «ЧитаемXML», который также можете посмотреть в выгрузке, здесь же приведу только код:

&НаКлиенте Процедура ОдинСтудент(Команда)
	
	ОдинСтудентСервер(XML);
	
КонецПроцедуры 
&НаСервереБезКонтекста Процедура ОдинСтудентСервер(XML)

	// Получаем тип XDTO и читаем XML 	лТип = ФабрикаXDTO.Тип("http://localhost/xdto", "students");
	лЧтение = Новый ЧтениеXML;
	лЧтение.УстановитьСтроку(XML);
	лОбъект = ФабрикаXDTO.ПрочитатьXML(лЧтение, лТип);
	лДанные = лОбъект.student;
	
	// Проверяю, нет ли этого студента в базе 	лЗапрос = Новый Запрос("ВЫБРАТЬ | Студенты.Ссылка |ИЗ | Справочник.Студенты КАК Студенты |ГДЕ | Студенты.Имя ПОДОБНО ""%"" + &Имя + ""%"" | И Студенты.Фамилия ПОДОБНО ""%"" + &Фамилия + ""%"" | И Студенты.ДатаРождения = &ДатаРождения");
						  
	лЗапрос.УстановитьПараметр("Имя", лДанные.name);
	лЗапрос.УстановитьПараметр("Фамилия", лДанные.last_name);
	лЗапрос.УстановитьПараметр("ДатаРождения", лДанные.birth);
	
	лРезультат = лЗапрос.Выполнить();
	
	// Если нет, создаю новый элемент 	Если лРезультат.Пустой() Тогда 		
		лСпр = Справочники.Студенты.СоздатьЭлемент();
		
	// Иначе редактирую имеющийся 	Иначе 		
		лВыборка = лРезультат.Выбрать();
		Пока лВыборка.Следующий() Цикл 			
			лСпр = лВыборка.Ссылка.ПолучитьОбъект();
			Прервать;
			
		КонецЦикла;
		
	КонецЕсли;
	
	// Заполняю данными, заметьте, никакого преобразования не требуется 	лСпр.Имя = лДанные.name;
	лСпр.Фамилия = лДанные.last_name;
	лСпр.ДатаРождения = лДанные.birth;
	лСпр.Пол = лДанные.sex;
	лСпр.Курс = лДанные.level;
	лСпр.ЭтоСтароста = лДанные.this_leader;
	
	лСпр.Записать();
	
КонецПроцедуры // ПрочитатьИЗаписатьСервер()  

Вы можете видеть, что код очень прост, и никакого преобразования элементов прочитанного XML не требуется, это делает уже ФабрикаXDTO. Ну что же, запустим нашу обработку и проверим, появится ли новый элемент в справочнике «Студенты». Ошибка!

 

Дело здесь вот в чем, в XML мы не указали name spaces (пространство имен), давайте возьмем XML, который я привел выше и добавим:

xmlns=»http://localhost/xdto» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» — вот что мы добавили и все заработало.  Скачайте выгрузку базы данных (ссылка ниже), распакуйте у себя и попробуйте прочитать XML. Попробуйте изменить данные в XML, поэкспериментируйте.

СЛУЧАЙ II

Предположим что в XML у нас не один студент, а несколько (скорее всего так и будет):

Обратите внимание на комментарий , очень удобный редактор XML, а главное бесплатный. Если попробуете его прочитать с помощью схемы, которую мы сделали, вы получите ошибку, и это правильно, в схеме мы не указывали, что элементов student может быть много. Давайте исправим эту ситуацию, я создал новый пакет «ЧтениеСтуденты» и новое пространство имен «http://localhost/xdto/students» и изменил свойство «student»:


Обратите внимание, свойство «Максимальное количество» я изменил на «-1″, это означает, что элементов student может быть неограниченное количество. Если мы установим это свойство равным «3″, то элементов student не может быть больше 3 и т.д.  Для обработки этого XML я создал новую процедуру, привожу скрин обработки:


Кнопка «Один студент» эта старая процедура, когда в XML была информация только по одному студенту, кнопка «Много студентов» для обработки информации по неограниченному числу студентов. Не забудьте изменить пространство имен в XML (второй красный кружок на рисунке). Запускаю обработку и все получается! Меняю данные (кроме имени, фамилии и даты рождения, при их изменении создается новый элемент справочника) и созданные элементы редактируются! Ну просто великолепно!


А здесь можете полюбоваться на код. Конечно, нельзя запрос в цикл помещать, по хорошему, нужно все данные получить одним запросом, но оптимизацией не буду заниматься, лень мне:

&НаКлиенте Процедура МногоСтудентов(Команда)
	
	МногоСтудентовСервер(XML);
	
КонецПроцедуры 
&НаСервереБезКонтекста Процедура МногоСтудентовСервер(XML)

	// Получаем тип XDTO и читаем XML 	лТип = ФабрикаXDTO.Тип("http://localhost/xdto/many_students", "students");
	лЧтение = Новый ЧтениеXML;
	лЧтение.УстановитьСтроку(XML);
	лОбъект = ФабрикаXDTO.ПрочитатьXML(лЧтение, лТип);
	
	Для Каждого лДанные Из лОбъект.student Цикл 	
		
		// Проверяю, нет ли этого студента в базе 		лЗапрос = Новый Запрос("ВЫБРАТЬ | Студенты.Ссылка |ИЗ | Справочник.Студенты КАК Студенты |ГДЕ | Студенты.Имя ПОДОБНО ""%"" + &Имя + ""%"" | И Студенты.Фамилия ПОДОБНО ""%"" + &Фамилия + ""%"" | И Студенты.ДатаРождения = &ДатаРождения");
							  
		лЗапрос.УстановитьПараметр("Имя", лДанные.name);
		лЗапрос.УстановитьПараметр("Фамилия", лДанные.last_name);
		лЗапрос.УстановитьПараметр("ДатаРождения", лДанные.birth);
		
		лРезультат = лЗапрос.Выполнить();
		
		// Если нет, создаю новый элемент 		Если лРезультат.Пустой() Тогда 			
			лСпр = Справочники.Студенты.СоздатьЭлемент();
			
		// Иначе редактирую имеющийся 		Иначе 			
			лВыборка = лРезультат.Выбрать();
			Пока лВыборка.Следующий() Цикл 				
				лСпр = лВыборка.Ссылка.ПолучитьОбъект();
				Прервать;
				
			КонецЦикла;
			
		КонецЕсли;
		
		// Заполняю данными, заметьте, никакого преобразования не требуется 		лСпр.Имя = лДанные.name;
		лСпр.Фамилия = лДанные.last_name;
		лСпр.ДатаРождения = лДанные.birth;
		лСпр.Пол = лДанные.sex;
		лСпр.Курс = лДанные.level;
		лСпр.ЭтоСтароста = лДанные.this_leader;
		
		лСпр.Записать(); 	
	КонецЦикла;

КонецПроцедуры // МногоСтудентовСервер() 

Если вы заметили, ну конечно вы заметили, никакого преобразования типов делать не пришлось.

СЛУЧАЙ III

Предположим, у нас есть XML, где нет информации по студентам (такой случай тоже нужно предусмотреть, в выгрузках бывает 1 элемент, бывает много, бывает что и ничего). Текст ниже:

 

Попробуем его прочитать нашей обработкой. Что получили? Фигу!


И правильно! Мы же в фабрике указали что элентов students может быть от одного до бесконечности. А здесь у нас ноль, поэтому и ругается. Давайте исправим этот момент:


Обратили внимание? Ну конечно обратили, я же, блин, красным овалом выделял (жмакайте на скрин, чтобы сделать больше). Минимальное значение я сделал равным нулю, а максимальное значение оставил -1, т. е. неограниченным. Теперь все чики пуки ( не знаю с какого языка это выражение). Можете сами проверить, нажмите на кнопку «Много студентов» в обработке.

СЛУЧАЙ IV

Все! Мы вроде предусмотрели все случаи! Можно идти пить… чай ;) . Но тут нам присылают еще один XML:

Вставляем XML в текстовое поле, жмем «Много студентов». Что получаем? Ошибку! А почему, посмотрите на XML. Появился новый элемент comment (комментарий), который не учтен в нашей фабрике. Что же делать? Можно его включить в нашу схему, но что если опять придет файл уже с другим элементом XML? Этот случай можно обработать следующим образом, открываем в фабрике свойства type_student и свойство «Открытый» устанавливаем «Истина»:

 

Ну вот и все. Теперь XML у вас прочитается без проблем. Теперь тэг student может содержать кроме заданных любые другие тэги и они буду прочитаны как строковый тип. Т.е.  я могу использовать переданный мне элемент comment. Он определился как строковый. Свойство открытый означает, что тип может содержать кроме прописанных любые другие элементы, которые он прочитает как строковый. Все, выдохся. Удачи, везения и чтобы наглости вам не надо было занимать! dt-шка ниже.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
xdto.zip
.zip 24,19Kb
29.01.14
70
.zip 24,19Kb 70 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Призрак (davdykin) 29.01.14 20:36
Спасибо за статью. Действительно удобный механизм, и пару моментов для себя узнал новых.
Мах; VzhenyaV; veiuper; check2; vz1987; MikeI; Chif13; rosinfo1; Makushimo; slavap; cleaner_it; rayastar; shalimski; +13 Ответить
2. Доржи Балбаров (Angeros) 30.01.14 07:18
Если механизм чтения xml через xdto позволяет читать его без схемы, возможна ли автоматическая генерация xsd схемы, хотя-бы в той части где стандартный механизм справился с чтением данных.?
3. Доржи Балбаров (Angeros) 30.01.14 07:26
Как будет читаться вот такой хмл?

...
<students>
<student>
<Name>Alex</student>
<sex>male</sex>
<date>2000-01-01</date>
<weighting unitOfMeasure="kg">70</weighting>
<Age>23</Age>
</student>
...
<students>
...
...Показать Скрыть


особенно строка <weighting unitOfMeasure="kg">70</weighting> в xdto уменя с такой строкой были трудности.
Она читалась, но число 70 не читалось.
4. Alexander Masson (mrmasson) 30.01.14 08:50
Спасибо за статью! Удобно для начинающих рассматривать xdto. Самое главное все последовательно - от простого к сложному!
5. Osiris_ (StaticUnsafe) 30.01.14 09:10
Яростно плюсую. Спасибо за ликбез!
6. Сергей Ожерельев (Поручик) 30.01.14 10:14
Очередная неплохая статья по XDTO.
7. Максим Зудин (kasper076) 30.01.14 10:17
(3) Angeros, есть такая беда. Если в узле присутствует атрибут и значение, то значение не читается.
8. Сергей Рудаков (fishca) 30.01.14 10:23
Статья годная!!! Спасибо!!!
9. Евгений К (John_d) 30.01.14 11:01
Отличная статья, Спасибо!
10. Евгений К (John_d) 30.01.14 11:03
(3) Angeros,
в ней ошибка:
<weighting unitOfMeasure=\"kg\">70</weighting>

правильно
<weighting unitOfMeasure="\kg\">70</weighting>
11. Доржи Балбаров (Angeros) 30.01.14 12:04
(10) John_d, Редактор инфостарта нерасчитан на публикацию текста xml у меня в редакторе все правильно написано, отображается чехорда. По этой причине автор выложил примеры хмл в виде изображений.
12. Светлана Юсубуллина (Swetlana) 30.01.14 15:19
Хорошая статья, надо будет изучить.
13. Иван (SinglCOOLer) 30.01.14 15:27
сначала было не хотел читать, но начал читать и втянулся, все круто описано, очень познавательно, спасибо
14. Василий Дугин (vasko88) 30.01.14 19:02
Спасибо, действительно грамотно и просто описано как работать с пакетам xdto
15. Андрей Овсянкин (Evil Beaver) 31.01.14 00:36
Пардон, не смог дочитать из-за вычурного стиля повествования. Выпендреж. Готов поверить коллегам, что статья годная.
16. Ирли Бёрд (EarlyBird) 31.01.14 05:02
17. JusteR Upra (JusteRU) 31.01.14 05:10
Спасибо! Очень интересная статья про ещё неизведанную часть 1С. А программно нельзя эти схемы формировать можно?
18. srv80 Роман (srv80) 31.01.14 06:17
Прочитать XML действительно не проблема с помощью XDTO, но сформировать XML по XDTO, который можно передать в качестве SOAP запроса на веб-сервер ... вот тут борода, которую пришлось решать через DCOM объект и таким кривым образом, что даже публиковать смешно )
19. Алекс Одинэсник (Alex1Cnic) 31.01.14 08:48
(17) JusteRU,
Присоединяюсь :А программно нельзя эти схемы формировать можно?
20. Анатолий Бритько (headMade) 31.01.14 10:14
21. Андрей Овсянкин (Evil Beaver) 31.01.14 11:40
(20) headMade, (19) Alex1Cnic, ну тогда и я отрекламируюсь, читайте тут:
http://infostart.ru/public/167459/
22. Роман Озеряный (rozer) 31.01.14 12:52
Молодца... и не сухо а с юмором :)
23. kiruha Дронов (kiruha) 31.01.14 12:56
Нифига не понял, зачем, чтобы прочитать простой XML файл нужно менять конфигурацию и вводить новые объекты.
Без программного создания интересно только в познавательных целях

24. Максим Кузнецов (Makushimo) 31.01.14 13:05
Просто, легко и доступно.
Стиль изложения поднял настроение -))
25. Дмитрий Глеков (glek) 31.01.14 17:10
Хорошая статья, спасибо. Ставлю в закладки.
26. Росинфо 1 (rosinfo1) 31.01.14 17:59
Спасибо за статью, пол года назад потратил огромную кучу времени, пока понял что такое XDTO, и как его к веб-сервису прикрутить. Т.к документация в желтой книжке написана для людей которые понимают, что это такое, а не для таких как я ))
27. Владимир Клименко (KliMich) 31.01.14 18:19
Сбасибо! Надо обязательно попробовать .
28. Валентин Бомбин (so-quest) 02.02.14 16:56
вот еще бы автор показал как namespace вставлять автоматом в те xml что присылают (руками то да, можно... но если файлов штук 500? если namespace'ов тоже больше 1? )...

Не качал конечно конфигу - но мои пять копеек чисто по статье
1. Пол может принимать любое строковое значение. Не всегда корректно. Потравив в статье пару абзацев можно было показать такой механизм как ограничения (ввести тип который принимает 2 значения "мужской" и "женский")
2. Нет примера записи
3. Нет примера создания схемы на лету (не всегда можно в конфигурацию встроить объект)
4. Нет примера на использование базового типа.
5. О типе число сказано вскользь, а ведь их несколько - на каждом свое ограничение.
check2; gingerale; SirYozha; kasper076; via; kiruha; Evil Beaver; kostas; +8 Ответить 1
29. tixis1c tixis1c (qwed557) 03.02.14 05:26
отличная статья, надо подробно все изучить, и жизнь наладиться ))), еще бы для 7.7 такие фишки были бы, или они есть?
Прикрепленные файлы:
30. Анатолий Бритько (headMade) 03.02.14 15:04
(28) so-quest,
ну так может у вас есть желание дать ответ на ваши вопросы в виде коментария или в виде статьи ????
31. Валентин Бомбин (so-quest) 03.02.14 17:12
по 2,3,4 - напишу как нибудь, там ничего сложного, просто тупо пересказать СП
по 1 - лениво делать скриншоты
по 5 - читать http://www.ozon.ru/context/detail/id/7410082/ Слишком большая тема, в 1 статье ну никак не осветить
32. Алекс Маслюков (Alex_1066) 04.02.14 17:19
(23) А можно и поделиться с товарищами, и рассказать про ещё один вариант чтения (без изменения конфигурации). Я думаю всем будет интересно.
33. Алекс Маслюков (Alex_1066) 04.02.14 17:20
Статья хоршая, для начала.... Продолжение не помешало бы с учетом оговорок, данных читателями статьи в комментариях... Спасибо.
34. Валентин Бомбин (so-quest) 04.02.14 21:14
Анонс :)
Следите за новыми публикациями :)
Сейчас пройдет модерацию и сразу -

Построение XSD схемы на лету или любите СП источник знаний

В статье показаны 2 простых варианта создания схемы «на лету».
Приведенный код не следует рассматривать как законченное решение, скорее как расширеннее для синтаксис-помощника.
Код приводиться «как есть», я не несу никакой ответственности если что-то у вас поломается или пойдет не так.

Вариант №1
Используется СоздатьФабрикуXDTO. В архиве файл Вариант-1.epf

Вариант 2
Используется конструктор для ФабрикаXDTO В архиве файл Вариант-2.epf

Есть еще вариант №3 – основан на построении схемы – но мне этот вариант никогда был не интересен, поэтому оставим его добровольцам.
35. Александр (МимохожийОднако) 05.02.14 07:48
36. Валентин Бомбин (so-quest) 05.02.14 11:15
ответ на вопрос - как создавать фабрику на лету. Теперь не нужно насиловать конфигурацию, встраивая пакеты.

http://infostart.ru/public/256028/
37. kiruha Дронов (kiruha) 05.02.14 11:34
(36)
Скооперировались бы с автором ))
Чтобы в одной статье все
38. Саша Безымяный (help1Ckr) 05.02.14 11:40
Спасибо огромное за статью! Как раз мучаюсь с xml. Для мну это темный лес(
39. Яков Коган (Yashazz) 09.02.14 13:48
Ну, баянненько и попсовенько, трёпа много и толка маловато, но для совсем начинающих сгодится. Особенно для тех, кому встроенную справку 1С читать лень.

Если хотите действительно серьёзный подход - читайте статьи от Evil Beaver, рекомендую.

Автор, можешь подробно рассказать о создании xsd "с нуля" на основе объектов платформы? Хочу, понимаешь, все типы и фасеты описать, да чтоб программно. И ещё нужна статья о разнице в понимании схем для 1С и нормальных xsd-схем, или "почему 1С не читает валидные схемы".
И, до кучи, расскажи о работе с XPath :)

А то, понимаешь, "пророка" тут изображает, азы пересказывая...
Infactum; +1 Ответить
40. Юрий Река (Peka) 12.02.14 15:52
Как прочитать? Можно с помощью объекта «ЧтениеXML», но тогда нужно будет построчно обрабатывать документ. И хорошо если уровней вложенности всего лишь 2-3. А если их 10.


Сделал загрузку и выгрузку документа через ЧтениеXML и ЗаписьXML в результате появился XML файл:
<DocumentObject.ЗаказКлиента>
	<Ref>db7359f0-065d-11e3-bb9e-f0def1177243</Ref>
	<DeletionMark>false</DeletionMark>
	<Date>2013-08-16T17:23:55</Date>
	<Number>000000001</Number>
	<Posted>false</Posted>
	<Клиент>70038ad4-0613-11e3-8b3a-f0def1177243</Клиент>
	<Склад>d1464cbc-0612-11e3-8b3a-f0def1177243</Склад>
	<Товары>
		<Row>
			<Товар>6ca1f6db-0615-11e3-8b3a-f0def1177243</Товар>
			<Количество>2</Количество>
			<Цена>5000</Цена>
			<Сумма>10000</Сумма>
		</Row>
	</Товары>
</DocumentObject.ЗаказКлиента>
...Показать Скрыть

и как результат вопрос: А есть механизм, который позволит проставить соответствие тегов при загрузке XML файла ?
41. Яков Коган (Yashazz) 12.02.14 16:47
Кстати, маленькая подсказка тем, кто не желает мучиться с обходами по ЧтениеXML - есть такая хорошая штука "ПостроительDOM". Работает быстро, ресурсы кушает меньше, чем любые коллекции XDTO, и вообще очень удобен.
42. Валентин Бомбин (so-quest) 13.02.14 11:44
(40) http://infostart.ru/public/256836/
(41) "ресурсы кушает меньше" - это такая шутка? DOM вообще-то в памяти разворачивается. И с точки зрения потребления памяти ЧтениеXML - выгодней. Или у вас какой-то специфический DOM?
В заголовке статьи говориться про XDTO, поэтому к вашему "очень удобен" - пример когда DOM контролирует тип и отвечает на вопрос - соответствует xml схеме или нет - можете привести? Думаю с вашим опытом это не составит труда.
43. Яков Коган (Yashazz) 13.02.14 14:58
(42) Я не про ЧтениеXML. Я про СписокXDTO и прочая, взятые через сериализатор, каковые более жадны, чем построитель и его вторичные выборки.
А что касается проверки, то это вы про ЧтениеХМЛ.ОткрытьФайл, который проверяет согласно набору схем? Вообще хороший вопрос, навскидку не отвечу, надо ещё поискать. Но, думаю, есть ходы.
44. Валентин Бомбин (so-quest) 13.02.14 16:46
Это плата за типизацию и верификацию. Если не нужны такие навороты - не используй схемы. там уже всякие xpath или xslt
45. Валентин Бомбин (so-quest) 13.02.14 16:50
там уже всякие xpath или xslt начинают рулить.
46. Николай Зайцев (Zero_nv) 17.02.14 08:15
Обновите в статье картинки плиз.
47. Андрей Овсянкин (Evil Beaver) 17.02.14 10:26
(41) Yashazz, какие это ресурсы DOM кушает меньше?
48. Сергей (Che) Коцюра (CheBurator) 18.02.14 23:27
ну да.. понятно, что вопросамы о потребляемых ресурсах - это не наш путь...
49. sun888 (malikov_pro) 20.02.14 19:05
автору спс, мои 5 коп по теме

Имеем файл XML в 200 МБайт с не регламентированной структурой, платформа 8.3 (в БП 3.0 гружу),
при загрузке чз XDTO +1,5 ГБ ОЗУ, работает стабильно, при DOM за +2ГБ, 1 раз с ошибкой вылетел.
При этом в XDTO не самый удобный интерфейс при работе с 0-1 (может значение быть а может и не быть).

Решил задачу загрузкой отдельных элементов в структуру + ТЗ и её обработку (памяти на порядок меньше расходуется).

&НаСервере
Функция ЗначенияXMLВСтруктуру(ЧитатьXML, ИмяРодителя, НеЧитать=Ложь) 
// НеЧитать - это если уже в элемент структуры провалился
	Структура = Новый Структура;
	Ключ = "";
	Значение = "";
	Пока ЕстьЧтоЧитать(НеЧитать) Цикл
		///
		Если ЧитатьXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Ключ = ЧитатьXML.Имя;
			ЧитатьXML.Прочитать();
			Если ЧитатьXML.ТипУзла = ТипУзлаXML.Текст Тогда
				Структура.Вставить(Ключ,ЧитатьXML.Значение);
			ИначеЕсли ЧитатьXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
				
				СтруктураВременная = ЗначенияXMLВСтруктуру(ЧитатьXML, Ключ, Истина);
				Если Структура.Свойство(Ключ,Значение) Тогда
					Если ТипЗнч(Значение) = Тип("Структура") Тогда
						ТЗ = ТаблицаЗначенийИзСтруктуры(Значение);
						ТЗ = ДобавитьСтруктуруКакСтрокуТЗ(ТЗ, СтруктураВременная);
					ИначеЕсли ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда
						ТЗ = ДобавитьСтруктуруКакСтрокуТЗ(Значение, СтруктураВременная);					
					КонецЕсли;
					Структура.Вставить(Ключ, ТЗ);
				Иначе
					Структура.Вставить(Ключ, СтруктураВременная);
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли (ЧитатьXML.Имя = ИмяРодителя) и (ЧитатьXML.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда
			Возврат Структура;
		КонецЕсли;
		////
		НеЧитать = Ложь;
	КонецЦикла;
Возврат Структура;
КонецФункции

&НаСервере
Функция ТаблицаЗначенийИзСтруктуры(Структура)
	ТЗ = Новый ТаблицаЗначений;
	Для каждого Строка Из Структура Цикл
		ТЗ.Колонки.Добавить(Строка.Ключ);
	КонецЦикла;
	
	ТЗ = ДобавитьСтруктуруКакСтрокуТЗ(ТЗ, Структура);
	
	Возврат ТЗ;
	
КонецФункции

&НаСервере
Функция ДобавитьСтруктуруКакСтрокуТЗ(ТЗ, Структура)
	
	СтрТЗ = ТЗ.Добавить();
	Для каждого Строка Из Структура Цикл
		Попытка
			СтрТЗ[Строка.Ключ] = Строка.Значение;	
		Исключение
			ТЗ.Колонки.Добавить(Строка.Ключ);
			СтрТЗ[Строка.Ключ] = Строка.Значение;
		КонецПопытки;
		
	КонецЦикла;
	
	Возврат ТЗ;
КонецФункции

&НаСервере
Функция ЕстьЧтоЧитать(Флаг)
	
	Если Флаг Тогда
		Возврат(Истина);
	КонецЕсли; 
	
	Если ЧитатьXML.Прочитать() Тогда
		Возврат(Истина);
	Иначе
		//Предупреждение("Файл прочитан полностью!");
	    Возврат(Ложь);
	КонецЕсли;
КонецФункции


...Показать Скрыть


проверку на значение 0-1 организовал
Если Структура.Свойство("type",Значение) И Значение = "у" Тогда
51. Валентин Бомбин (so-quest) 20.02.14 21:39
для проверки на 0-1 проще добавить в схему предопределеное значение. или развести на 2 разных типа.
52. Павел (d0dger) 28.02.14 12:52
(49) угу, тоже делал подобное в дерево структур
53. Mike Scherbakov (blackschool) 03.06.16 17:25
(18) srv80, такую задачу можно решить, собирая текст soap-запроса конкатенацией шапки, подвала и текста XML, полученного из XDTO. Криво, но достаточно устойчиво работает, поскольку шапка и подвал универсальны.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа