Загрузка XML в дерево значений

0. 2292 17.11.16 12:58 Сейчас в теме
Случайно наткнулся на статью с алгоритмом загрузки XML-строки в дерево значений и подумал, а не проще ли сделать это через механизм XDTO рекурсивно. На мой взгляд, решение получилось неплохое - даже атрибуты грузит..

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4485 19.11.16 17:23 Сейчас в теме
Довольно просто для клиента. На сервере будет работать? Ведь строго говоря, вы читаете XML не в дерево значений, а в реквизит формы ДанныеФормыДерево
2. starik-2005 2292 19.11.16 23:07 Сейчас в теме
Это серверные процедуры. Просто в дерево тоже можно прочитать немного изменив код.
3. karpik666 3216 22.11.16 17:23 Сейчас в теме
(2) starik-2005, может они и серверные, но явно в коде используется данныеФормыДерево, а не дерево значений, поэтому ваш код будет работать только в контексте вызываемой формы, но не в общем модуле.
4. starik-2005 2292 22.11.16 20:07 Сейчас в теме
(3) karpik666, ну это чтобы у читателей была возможность подумать. Я за светлое коммунистическое будущее мыслителей и творцов, а не за общество потребительского кредитования...
adhocprog; +1 Ответить
5. genayo 23.11.16 08:19 Сейчас в теме
Вот такой XML, не загружаются значения, только атрибуты:

<Table:Record name="CustPickingExportDC" row="1">
<Table:Field name="SalesId">ФН000000053</Table:Field>
<Table:Field name="PickingListId">ФН000000053</Table:Field>
<Table:Field name="CustAccount">000000661</Table:Field>
<Table:Field name="ConsigneeAccount">000000755</Table:Field>
<Table:Field name="InventLocationId"/>
<Table:Field name="DeliveryDate">2016-11-23</Table:Field>
<Table:Field name="ManDate"/>
<Table:Field name="ItemId">ББ00065B125</Table:Field>
<Table:Field name="InventQty">3</Table:Field>
<Table:Field name="SalesUnit">кг</Table:Field>
<Table:Field name="SalesQty">18</Table:Field>
</Table:Record>
6. starik-2005 2292 23.11.16 11:14 Сейчас в теме
(5) genayo, да, при наличии "Namespace prefix" файл не грузится. Но если его убрать, то все работает:

Также заметил, что при наличии атрибутов у элемента и значение элемента - строка, а не вложенный контейнер, то я не нашел, как получить текст самого элемента у XDTO.
Прикрепленные файлы:
11. genayo 23.11.16 13:37 Сейчас в теме
(6) Вот и я не нашел как чисто через фабрику XDTO такой XML прочитать, пришлось использовать комбинацию XDTO и DOM, что на больших файлах несколько печально. Может, есть идеи как проще такой XML прочитать?
12. starik-2005 2292 28.11.16 22:16 Сейчас в теме
(11) как показал гугл, такая возможность есть. Видел в паре источников - сейчас не вспомню, в каких.
20. kasper076 77 17.09.18 12:41 Сейчас в теме
(11) нужно создать правильный пакет XDTO. Например такой, как во вложении. В нем значение элемента имеет тип число, а атрибут строка.
Прикрепленные файлы:
Схема.xsd
7. cartograph 23.11.16 11:42 Сейчас в теме
8. starik-2005 2292 23.11.16 12:13 Сейчас в теме
(7) cartograph, ну там просто чтение, а тут в дерево раскладывает прочитанное рекурсивненько. Не чувствуете разницу?
9. infostart user 20 23.11.16 12:29 Сейчас в теме
рекурсия, вложенные циклы - есть куда оптимизировать. кажись уже такие штуки на инфостарте не раз публиковали
10. starik-2005 2292 23.11.16 13:05 Сейчас в теме
(9) infostart user, в данном конкретном случае оптимизировать, поверьте, особо некуда - вложенные циклы тут как раз уместны. А рекурсия - это вообще один из немногих способов организовать цикл в функциональном программировании, хотя, конечно, 1С тут в плане функциональности весьма ограничена.

Но если Вы предложите вариант оптимизации - велкам! ))
13. boln 1031 24.06.17 18:07 Сейчас в теме
Случайно наткнулся на статью с алгоритмом загрузки XML-строки в дерево значений
Не на эту, случайно?
http://infostart.ru/public/14610/
14. starik-2005 2292 24.06.17 21:29 Сейчас в теме
(13)
Не на эту, случайно?
Неа.
15. starik-2005 2292 21.05.18 11:32 Сейчас в теме
Господа, внезапно узнал, как получить текст элемента при наличии атрибутов из объекта XDTO. Если интересно - могу написать еще одну статью на эту тему.
16. МихаилМ 22.05.18 10:23 Сейчас в теме
(15) также интересно через xslt
17. rozer 282 14.09.18 17:11 Сейчас в теме
можно проще просто последовательно читать

код в форме


&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
	Длг = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Длг.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", ЭтаФорма, "Открыть"));
КонецПроцедуры

&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДопПараметры) Экспорт
	Если НЕ Результат = Неопределено Тогда 
		ЧтениеXMLВДерево(Результат[0])
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ЧтениеXMLВДерево(Путь)
	XMLФайл = Новый ЧтениеXML;
	XMLФайл.ОткрытьФайл(Путь);
	ОбъектОбработка = РеквизитФормыВЗначение("Объект");
	ОбъектОбработка.ПрочитатьXMLПоТегам(XMLФайл, ОбъектОбработка.Дерево.Строки);
	ЗначениеВРеквизитФормы(ОбъектОбработка, "Объект");
	XMLФайл.Закрыть();
КонецФункции

Показать


код в модуле

Процедура ПрочитатьXMLПоТегам(XMLФайл, ТекущийНаборСтрок) Экспорт
    Пока XMLФайл.Прочитать() Цикл
		Если XMLФайл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			
            НоваяСтрока = ТекущийНаборСтрок.Добавить();
            НоваяСтрока.Имя = XMLФайл.Имя;
            НоваяСтрока.Значение = "";
			Пока XMLФайл.ПрочитатьАтрибут() Цикл
				НоваяСтрокаАтрибут = НоваяСтрока.Строки.Добавить();
	            НоваяСтрокаАтрибут.Имя = XMLФайл.Имя;
	            НоваяСтрокаАтрибут.Значение = СокрЛП(XMLФайл.Значение);
			КонецЦикла;
			ПрочитатьXMLПоТегам(XMLФайл, НоваяСтрока.Строки);

		ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
			
            Возврат;
			
		ИначеЕсли XMLФайл.ТипУзла = ТипУзлаXML.Текст Тогда
			
            ТекущийНаборСтрок.Родитель.Значение = СокрЛП(XMLФайл.Значение);
			
        Иначе
			
            Сообщить("Тип узла: " + XMLФайл.ТипУзла + " НЕ ОБРАБОТАН", СтатусСообщения.Важное);
			
        Конецесли;
    КонецЦикла;
КонецПроцедуры
Показать


и еще ваш код при более чем одном узле зачем-то лепит лишнюю строку
результат разбора
файл
18. starik-2005 2292 14.09.18 17:23 Сейчас в теме
(17)
можно проще просто последовательно читать
На Инфостарте масса обработок, которые делают подобное.

По поводу текущей обработки, то она рекурсивно преобразует в дерево именно прочитанный XDTO-объект.

По поводу списка, то, полагаю, нужно посмотреть, как прочитался сам файл в объект XDTO.. У меня в коде при наличии списка XDTO в свойстве это свойство сначала создается. Решить можно просто - проверять, что в свойстве список и не создавать для него отдельную ветку дерева, а разворачивать в текущую.
19. rozer 282 14.09.18 18:45 Сейчас в теме
(18)
Решить можно просто - проверять, что в свойстве список и не создавать для него отдельную ветку дерева, а разворачивать в текущую.


это понятно ) просто думал бага а это фича )
21. RocKeR_13 900 26.09.18 16:57 Сейчас в теме
В данном случае у нас на управляемой форме есть дерево с двумя строковыми колонками "Узел" и "Значение".

Ну судя по коду и скрину должно быть
"Узел" и "Элемент"

Больше придирка, а по делу - спасибо)
22. starik-2005 2292 26.09.18 17:03 Сейчас в теме
(21)
Ну судя по коду и скрину должно быть
Истину глаголишь )))
23. gnom13 27.09.18 16:21 Сейчас в теме
Почему то тут не принимают во внимание что если у вас серверная база данных то это работать не будет.
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДопПараметры) Экспорт
    Если НЕ Результат = Неопределено Тогда 
        ЧтениеXMLВДерево(Результат[0])
    КонецЕсли;
КонецПроцедуры

В этой процедуре Результат[0] передаётся с клиентской машины. На сервере этого пути не будет Выдаст ошибку.
24. starik-2005 2292 28.09.18 10:40 Сейчас в теме
(23)
В этой процедуре Результат[0] передаётся с клиентской машины. На сервере этого пути не будет Выдаст ошибку.
На сервере нет, но данная процедура, если мне не изменяет память, клиентская, которая читает текст и передает его в:
Процедура ПоместитьВДерево(Текст)
	Чтение = Новый ЧтениеXML;
	Чтение.УстановитьСтроку(Текст);
	Об = ФабрикаXDTO.ПрочитатьXML(Чтение);
	
	Строка = Дерево.ПолучитьЭлементы().Добавить();
	Строка.Узел = "Корневой узел";
	ПрочитатьУзел(Об, Строка);
КонецПроцедуры
Показать
25. oaohkk 21.08.20 10:16 Сейчас в теме
Добрый день! Как испраивить ошибку?
Прикрепленные файлы:
26. starik-2005 2292 08.10.20 14:11 Сейчас в теме
(25) все зависит от условий, в которых она возникла.
Оставьте свое сообщение
Вопросы с вознаграждением