|
v7: Обход XML 1с 7.7 | ☑ | ||
---|---|---|---|---|
0
kupec
20.07.20
✎
16:03
|
Добрый день. Может ли кто-нибудь поделиться кодом для обхода xml документа. Чтобы обойти все узлы и атрибуты, так скажем прочитать XML. Заранее спасибо. Буду очень благодарен.
|
|||
1
azernot
20.07.20
✎
16:06
|
||||
2
kupec
20.07.20
✎
16:10
|
Спасибо, я это видел. Там конкретное позиционирование на конкретные узлы и атрибуты. А есть какая то универсальная обработка для чтения любого XML?
|
|||
3
Garykom
гуру
20.07.20
✎
16:19
|
(2) DOM или SAX ?
|
|||
4
Злопчинский
20.07.20
✎
18:16
|
(2) есть. Минут через 40 буду дома и скину
Процедура простая рекурсивная строк 20—30 |
|||
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); КонецЦикла; Состояние(""); КонецПроцедуры //прПечатьУзлов() |
|||
7
Garykom
гуру
20.07.20
✎
18:54
|
(6) Уверен что это взлетит при размере XML файлика под гиг?
|
|||
8
Злопчинский
20.07.20
✎
18:56
|
(7) хз.. вряд ли кто станет такой хренью читать файл под гиг.
но если файлик есть - давай, попробую |
|||
9
Duke1C
21.07.20
✎
08:56
|
(8) Боюсь, окно сообщений лопнет от такого файлика))
|
|||
10
kupec
21.07.20
✎
09:38
|
Спасибо, думаю это то что надо
|
|||
11
Ленинград
21.07.20
✎
09:42
|
(9) не лопнет, но тормозить начнет
|
|||
12
kupec
21.07.20
✎
10:04
|
Мой файл не читает, ошибку выдает на первой же строке
Если (ТекУзел.childNodes.length=1) and (ТекУзел.childNodes.item(0).nodetype=3) Тогда Текст=ТекУзел.childNodes.item(0).text; КонецЕсли; Вот этом месте кода |
|||
13
kupec
21.07.20
✎
10:10
|
Добавил этот блок в Попытку-Исключение, заработало
Можно пояснить, что означает этот блок, я так понимаю, он читает значение атрибута? |
|||
14
kupec
21.07.20
✎
10:12
|
некоторые атрибуты не выводит
|
|||
15
kupec
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 |
|||
19
kupec
22.07.20
✎
08:21
|
(16) т.е. если есть кавычки то функция не работает?
|
|||
20
Garykom
гуру
22.07.20
✎
08:57
|
||||
21
trad
22.07.20
✎
09:26
|
(12) при length=0 ошибка при обращении к .item(0)
|
|||
22
kupec
22.07.20
✎
09:33
|
(21) поправил. Заработало. Только все равно не все узлы и атрибуты выводит.
|
|||
23
kupec
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
|
атрибуты в СвЮЛУч и АдрРФ не прочитал
|
|||
27
trad
22.07.20
✎
12:03
|
||||
28
kupec
22.07.20
✎
12:40
|
(27) Спасибо
|
|||
29
Serginio1
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); //ТекУзел, было Узел |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |