Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Обход XML 1с 7.7

v7: Обход XML 1с 7.7
Я
   kupec
 
20.07.20 - 16:03
Добрый день. Может ли кто-нибудь поделиться кодом для обхода xml документа. Чтобы обойти все узлы и атрибуты, так скажем прочитать XML. Заранее спасибо. Буду очень благодарен.
   azernot
 
1 - 20.07.20 - 16:06
   kupec
 
2 - 20.07.20 - 16:10
Спасибо, я это видел. Там конкретное позиционирование на конкретные узлы и атрибуты. А есть какая то универсальная обработка для чтения любого XML?
   Garykom
 
3 - 20.07.20 - 16:19
(2) DOM или SAX ?
   Злопчинский
 
4 - 20.07.20 - 18:16
(2)  есть. Минут через 40 буду дома и скину
Процедура простая рекурсивная строк 2030
   Злопчинский
 
5 - 20.07.20 - 18:51
//**************************************************************************************

//
Процедура прТестовоеЧтение()
    
    Если ПустаяСтрока(ВыбФайл)=1
    Тогда
        Сообщить("тестовое чтение файла обмена: не задано имя файла..?","i");
        Возврат;
    КонецЕсли;    
        
    оТест =  СоздатьОбъект("Microsoft.XMLDOM");
    оТест.Load(ВыбФайл);
    Корень = оТест.DocumentElement;
    ОчиститьОкноСообщений();
    прПечатьУзлов(оТест, Корень, 0);
    
КонецПроцедуры//прТестовоеЧтение()
   Злопчинский
 
6 - 20.07.20 - 18:52
//**************************************************************************************

//
Процедура прПечатьУзлов(xmlDoc, Узел, Уровень=0)
    Состояние(Уровень);
    
    ЧислоДетей = Узел.childNodes.length;
    Для Инд=1 По ЧислоДетей    Цикл
        
        ТекУзел= Узел.childNodes.item(Инд-1);
        Если ТекУзел.nodeType<>1 Тогда Продолжить; КонецЕсли;
        
        Стр = Формат("","С"+Уровень*8);
        
        СтрАтрибуты="";
        
        Для Инд2=1 По Узел.attributes.length Цикл
            Атрибут=Узел.attributes.item(Инд2-1);
            СтрАтрибуты=СтрАтрибуты+?(СтрАтрибуты="","",";")+Атрибут.nodename+"="+Атрибут.value;
        КонецЦикла;
        
        Текст="";
        Если (ТекУзел.childNodes.length=1) and (ТекУзел.childNodes.item(0).nodetype=3) Тогда 
            Текст=ТекУзел.childNodes.item(0).text;
        КонецЕсли;
        
        Стр=Стр+ТекУзел.tagName+?(СтрАтрибуты="","","("+СтрАтрибуты+")" ) + ":" +Текст;
        Сообщить(Стр);
        прПечатьУзлов(xmlDoc, ТекУзел, Уровень+1);
    КонецЦикла;
    
    Состояние("");
КонецПроцедуры//прПечатьУзлов()
   Garykom
 
7 - 20.07.20 - 18:54
(6) Уверен что это взлетит при размере XML файлика под гиг?
   Злопчинский
 
8 - 20.07.20 - 18:56
(7) хз.. вряд ли кто станет такой хренью читать файл под гиг.
но если файлик есть - давай, попробую
   Duke1C
 
9 - 21.07.20 - 08:56
(8) Боюсь, окно сообщений лопнет от такого файлика))
   kupec
 
10 - 21.07.20 - 09:38
Спасибо, думаю это то что надо
   Ленинград
 
11 - 21.07.20 - 09:42
(9) не лопнет, но тормозить начнет
   kupec
 
12 - 21.07.20 - 10:04
Мой файл не читает, ошибку выдает на первой же строке
        Если (ТекУзел.childNodes.length=1) and (ТекУзел.childNodes.item(0).nodetype=3) Тогда 
            Текст=ТекУзел.childNodes.item(0).text;
        КонецЕсли;

Вот этом месте кода
   kupec
 
13 - 21.07.20 - 10:10
Добавил этот блок в Попытку-Исключение, заработало
Можно пояснить, что означает этот блок, я так понимаю, он читает значение атрибута?
   kupec
 
14 - 21.07.20 - 10:12
некоторые атрибуты не выводит
   kupec
 
15 - 21.07.20 - 10:18
<СвОЭДОтпр НаимОрг="ООО "Компания "Тензор"" ИдЭДО="2BE" ИННЮЛ="7605016030"/> вот на этом рушится
   Злопчинский
 
16 - 21.07.20 - 14:53
(15) потому что кавычки внутри кавычек - это ненормально.
   Злопчинский
 
17 - 21.07.20 - 14:54
(13) нет, не атрибута.
он читает текст типа <СуммНал>420.00</СуммНал> - текст внутри тега
   Злопчинский
 
18 - 21.07.20 - 17:08
(14) выводит все нормально.
у меня эта процедура используется для тестового просмотра во всяких загрузках, читает выводит все нормально.
вот как раз сейчас Гиперглобус поправлял

Order-Header:
        OrderNumber:22217678
        OrderDate:2020-07-21
        ExpectedDeliveryDate:2020-07-24
        ExpectedDeliveryTime:09:00
        Currency:RUB
        DocumentFunctionCode:O
Order-Parties:
        Buyer:
                ILN:4680387000006
        Seller:
                ILN:4607172169991
                CodeByBuyer:26705
        DeliveryPoint:
                ILN:4680387000006
                Name:Логистика
                StreetAndNumber:г.Пушкино,Красноармейское ш. 107/1
                CityName:Пушкинский район
                PostalCode:141211
                Country:RU
                PhoneNumber:495 223-75-00
                LocationNumber:5600
        Invoicee:
                ILN:4690202000005
Order-Lines:
        Line:
                Line-Item:
                        LineNumber:1
   kupec
 
19 - 22.07.20 - 08:21
(16) т.е. если есть кавычки то функция не работает?
   Garykom
 
20 - 22.07.20 - 08:57
   trad
 
21 - 22.07.20 - 09:26
(12) при length=0 ошибка при обращении к .item(0)
   kupec
 
22 - 22.07.20 - 09:33
(21) поправил. Заработало. Только все равно не все узлы и атрибуты выводит.
   kupec
 
23 - 22.07.20 - 09:38
https://yadi.sk/d/2v0wk2dE-bc_gA
Попробуйте данным кодом прочитать этот файл
   Злопчинский
 
24 - 22.07.20 - 11:55
(23) угу, атрибуты не читает в комплексных типах,
это уже вечером только покопаюсь
   Злопчинский
 
25 - 22.07.20 - 11:56
ИдСв:
                                СвЮЛУч:
                        Адрес:
                                АдрРФ:
   Злопчинский
 
26 - 22.07.20 - 11:56
атрибуты в СвЮЛУч и АдрРФ не прочитал
   trad
 
27 - 22.07.20 - 12:03
   kupec
 
28 - 22.07.20 - 12:40
(27) Спасибо
   Serginio1
 
29 - 22.07.20 - 14:11
   Злопчинский
 
30 - 22.07.20 - 16:37
(28) поправленное, вроде разбирает
.
Процедура прПечатьУзлов(xmlDoc, Узел, Уровень=0)
    Состояние(Уровень);
    
    ЧислоДетей = Узел.childNodes.length;
    Для Инд=1 По ЧислоДетей Цикл
        
        ТекУзел = Узел.childNodes.item(Инд-1);
        Если ТекУзел.nodeType<>1 Тогда Продолжить; КонецЕсли;
        
        Отступ = Формат("","С"+Уровень*8);
        СтрАтрибуты="";
        
        Для Инд2=1 По ТекУзел.attributes.length Цикл
            Атрибут=ТекУзел.attributes.item(Инд2-1);
            СтрАтрибуты=СтрАтрибуты+?(СтрАтрибуты="","",";")+Атрибут.nodename+"="+Атрибут.value;
        КонецЦикла;
        
        Текст="";
        Если ТекУзел.childNodes.length=1 Тогда
            Если ТекУзел.childNodes.item(0).nodetype=3 Тогда 
                Текст=ТекУзел.childNodes.item(0).text;
            КонецЕсли;    
        КонецЕсли;
        
        Стр = Отступ+ТекУзел.tagName+?(СтрАтрибуты="","","("+СтрАтрибуты+")" ) + ":" +Текст;
        Сообщить(Стр);
        
        прПечатьУзлов(xmlDoc, ТекУзел, Уровень+1);
    КонецЦикла;
    
    Состояние("");
КонецПроцедуры//прПечатьУзлов()
 
 Рекламное место пустует
   Злопчинский
 
31 - 22.07.20 - 16:37
//**************************************************************************************

//
Процедура прТестовоеЧтение()
    
    Если ПустаяСтрока(ВыбФайл)=1 Тогда
        Сообщить("тестовое чтение файла обмена: не задано имя файла..?","i");
        Возврат;
    КонецЕсли;    
        
    оТест =  СоздатьОбъект("Microsoft.XMLDOM");
    оТест.Load(ВыбФайл);
    Корень = оТест.DocumentElement;
    ОчиститьОкноСообщений();
    прПечатьУзлов(оТест, Корень, 0);
    
КонецПроцедуры//прТестовоеЧтение()
   Злопчинский
 
32 - 22.07.20 - 16:38
апшипачка была здесь:
.
       Для Инд2=1 По ТекУзел.attributes.length Цикл  //ТекУзел, было Узел

            Атрибут=ТекУзел.attributes.item(Инд2-1);//ТекУзел, было Узел


Список тем форума
Рекламное место пустует  Рекламное место пустует
Основная теорема систематики: Новые системы плодят новые проблемы.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.