![]() |
![]() |
![]() |
|
Чтение из XML дерева изделия. Как лучше парсить файлы такого вида? | ☑ | ||
---|---|---|---|---|
0
drugoimir
12.01.17
✎
09:08
|
Добрый день. Есть Файл XML, в котором описана структура изделия:
<Объект Код= "123" Имя ="Сборка1" Тип = "Сборка"> <СписокАтрибутов> <Атрибут Имя = ""> <Атрибут Количество = ""> </СписокАтрибутов> <СписокДетей> <объектСсылка Код ="1111111" Тип = "Документ"> <атрибутыссылки> </атрибутыссылки> </объектСсылка> <объектСсылка Код ="01234" Тип = "Констр"> <атрибутыссылки> </атрибутыссылки> </объектСсылка> <объектСсылка Код ="01235" Тип = "Констр"> <атрибутыссылки> </атрибутыссылки> </объектСсылка> </СписокДетей> <Объект> <Объект Код ="1111111" Имя = "ыфвфы"Тип = "Документ"> <СписокАтрибутов> <Атрибут Имя = ""> <Атрибут Количество = ""> </СписокАтрибутов> <Объект> <Объект объектСсылка Имя= "Болт 123" Код ="01234" Тип = "Констр"> <СписокАтрибутов> <Атрибут Имя = ""> <Атрибут Количество = ""> </СписокАтрибутов> ..... <Объект> Смысл такой, что идет описание выходного изделия в самом начале. Внутри в списке детей описываются ссылки на входящие в него части. После описания изделия на том же уровне ниже, уже идет описание атрибутов этих детей. У детей соответственно может быть описана своя структура и т.д. По ним только можно идентифицировать номенклатуру. Пока не совсем понял как лучше сделать, чтобы в момент чтения ссылки, получать ее атрибуты. Т.е., я читаю ссылку на номенклатуру, а все ее атрибуты идут ниже, поэтмоу я сразу не могу ее подгружать. Решение в лоб хочется сразу перейти ниже и прочитать атрибуты, потом вернутся и обрабатывать следующую ссылку. Как лучше сделать? |
|||
1
Cool_Profi
12.01.17
✎
09:10
|
Сначала создавай объекты-заглушки, без данных.
По мере прочтения - заполняй |
|||
2
drugoimir
12.01.17
✎
09:25
|
Вот вопрос в том как потом заполнять заглушки.
К примеру есть заглушка: МассивРазбора = Новый Массив; СтруктураИзделия("Имя,Тип,Количество,СоставДетей"); СоставДетей пускай будет тоже массив структур "СтруктураВходящихИзделий". Я вот на этом моменте застопорился. Как лучше ее описать. Можно сделать по реквизитам ссылки "Код,Количество". А после прочтения искать в масиве структур "СтруктураИзделия" описание атрибутов ссылки. Но мне кажется эта реализация слишком трудоемкой будет - полные переборы постоянно. Поэтому и хотелось на этапе заглушки сразу заполнять атрибуты ссылки. Как потом в масиве структур быстро искать атрибуты? И каким способом лучше читать? Фабрика, Xpath или обычным чтением? |
|||
3
MaxS
12.01.17
✎
09:30
|
Как вариант, использовать xdto. Создать схему и отправлять, принимать согласно этой схеме.
|
|||
4
Рэйв
12.01.17
✎
09:31
|
я при таких проблемах сначала все читал в массив , потом легче с ним работать,Всегда можно обратиться к любому элементы на выбор
//-------- Процедура Старт() мДанные=Новый Массив; ИнициализацияСлужебныхДанныхДляМТ(); Зип.ИзвлечьВсе(ПапкаАгента); Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл(ПапкаАгента+"\ToCDB.xml"); ПолучитьДанныеXML(мДанные,Чтение); КонецПроцедуры Процедура ПолучитьДанныеXML(мДанные,Чтение) Пока Чтение.Прочитать() Цикл // Прочитать "структурные части" элементов. // Проверить, какая часть элемента - текущая. Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда струкДанные=Новый Структура("ИмяУзла,струкАтрибуты,мПодчиненные,Значение"); мДанные.Добавить(струкДанные); ТекУзел=мДанные[мДанные.Количество()-1]; ИмяУзла = Чтение.Имя; //Сообщить("--" + ИмяУзла); ТекУзел.ИмяУзла=ИмяУзла; ТекУзел.струкАтрибуты=Новый Структура; ТекУзел.мПодчиненные=Новый Массив; Пока Чтение.ПрочитатьАтрибут() Цикл ТекУзел.струкАтрибуты.Вставить(Чтение.Имя,Чтение.Значение); КонецЦикла; ПолучитьДанныеXML(ТекУзел.мПодчиненные,Чтение); ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда ТекУзел.Значение=Чтение.Значение; ПолучитьДанныеXML(мДанные,Чтение); ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда Возврат; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
5
DrShad
12.01.17
✎
09:52
|
ДокументDOM вам в помощь - и читай в каком хочешь порядке
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |