Имя: Пароль:
1C
1С v8
Чтение из 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 вам в помощь - и читай в каком хочешь порядке