Как разобрать XML файл содержащий атрибуты
По теме из базы знаний
- XDTO - часть 3
- Препарирование xlsx файлов без MS Excel
- Синхронизация хранилища 1С и git-репозитория с применением OneScript и Gitsync. Методика и пошаговая инструкция для создания скрипта и его регулярного запуска
- Отправка электронной почты с помощью локального почтового клиента из 1С, развернутой под удаленным рабочим столом
- Подсистема регулярных выражений с использованием RegEx
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Процедура ЗагрузитьСодержимоеXML(ИмяФайла)
Если ПустаяСтрока(ИмяФайла) Тогда
Возврат;
КонецЕсли;
XML = Новый ЧтениеXML;
XML.ОткрытьФайл(ИмяФайла);
Пока XML.Прочитать() Цикл
Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
//Сообщить("<" + XML.Имя + ">");
Пока XML.ПрочитатьАтрибут() Цикл
//Сообщить(XML.Имя + " = " + XML.Значение);
Если XML.Имя="П000000000003" Тогда
Код=Справочники.ВидыАлкогольнойПродукции.НайтиПоКоду(XML.Значение);
КонецЕсли;
Если XML.Имя="NameOrg" Тогда
ПроизводительНаименование=XML.Значение;
КонецЕсли;
Если XML.Имя="INN" Тогда
ИНН=XML.Значение;
КонецЕсли;
Если XML.Имя="KPP" Тогда
КПП=XML.Значение;
КонецЕсли;
Если XML.Имя="П200000000013" Тогда
СтрДата=XML.Значение;
ДатаТТН=(Сред(СтрДата,7,4)+Сред(СтрДата,4,2)+Сред(СтрДата,1,2));
КонецЕсли;
Если XML.Имя="П200000000014" Тогда
ТТН=XML.Значение;
КонецЕсли;
Если XML.Имя="П200000000015" Тогда
ТД=XML.Значение;
КонецЕсли;
Если XML.Имя="П200000000016" Тогда
Объем=Число(XML.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если XML.ТипУзла = ТипУзлаXML.Текст Тогда
//Сообщить(XML.Значение);
КонецЕсли;
Если XML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
//Если ВидДекларации=Перечисления.ВидДекларации.Декларация11 Тогда
// ИмяЭлемент="Оборот";
//ИначеЕсли ВидДекларации=Перечисления.ВидДекларации.Декларация12 Тогда
// ИмяЭлемент="Продукция";
//КонецЕсли;
ИмяЭлемент="Продукция";
Если XML.Имя=ИмяЭлемент Тогда
НовСтрока=Таблица2.Добавить();
НовСтрока.Код=Код;
НовСтрока.Дата=ДатаТТН;
НовСтрока.ТТН=ТТН;
НовСтрока.ТД=ТД;
НовСтрока.Объем=Объем;
НовСтрока.ИзФайлаИНН=ИНН;
НовСтрока.ИзФайлаКПП=КПП;
НовСтрока.ИзФайлаПроизводитель=ПроизводительНаименование;
НовСтрока.Производитель=НайтиПроизводителя(ИНН,КПП);
КонецЕсли;
КонецЕсли;
КонецЦикла;
XML.Закрыть();
КонецПроцедуры
Показать
вот что у меня сейчас, это код
выдает
#textа а не string,
вот xml
<?xml version="1.0" encoding="UTF-8"?>
<string xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:ticketResponse xmlns:ns2="http://fclient.russianpost.org/postserver" xmlns:ns3="http://fclient.russianpost.org"><error ErrorTypeID="3" ErrorName="Ошибка авторизации: Превышен лимит количества запросов"/></ns2:ticketResponse></S:Body></S:Envelope></string>
Построитель = Новый ПостроительDOM;
ОтветДокумент = Построитель.Прочитать(ЧтениеXML);
Для Каждого Элемент0 Из ОтветДокумент.ЭлементДокумента.ДочерниеУзлы Цикл
сообщить(Элемент0.ИмяУзла);
Если Элемент0.ИмяУзла = "string" Тогда
Сообщить("123")
КонецЕсли
КонецЦикла;
Показатьвыдает
#textа а не string,
вот xml
<?xml version="1.0" encoding="UTF-8"?>
<string xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:ticketResponse xmlns:ns2="http://fclient.russianpost.org/postserver" xmlns:ns3="http://fclient.russianpost.org"><error ErrorTypeID="3" ErrorName="Ошибка авторизации: Превышен лимит количества запросов"/></ns2:ticketResponse></S:Body></S:Envelope></string>
(4)да куча сложностей, во первых
их моего файла видит только один элемент, заголовок, второй не видит, может не ЭлементДокумента
второе
пишет нет такого, с ваших же ресурсо примеры брал
Для Каждого Элемент0 Из ОтветДокумент.ЭлементДокумента.ДочерниеУзлы Цикл
их моего файла видит только один элемент, заголовок, второй не видит, может не ЭлементДокумента
второе
Элемент0.Атрибуты.ПолучитьИменованныйЭлемент("ErrorName"
пишет нет такого, с ваших же ресурсо примеры брал
(9) Не последовательно, а рекурсивно. Или с пониманием, что разбирается иерархия.
ОтветДокумент = Построитель.Прочитать(ЧтениеXML); - прочитывает только элемент верхнего уровня.
Чтобы узнать его дочерние узлы - нужен вложенный цикл. Типа:
Для ДокументDOM нет события конца чтения. Весь файл сразу прочитывается.
ОтветДокумент = Построитель.Прочитать(ЧтениеXML); - прочитывает только элемент верхнего уровня.
Чтобы узнать его дочерние узлы - нужен вложенный цикл. Типа:
Для Каждого Элемент0 Из ОтветДокумент.ЭлементДокумента.ДочерниеУзлы Цикл
сообщить(Элемент0.ИмяУзла);
Для Каждого Элемент1 Из Элемент0.ДочерниеУзлы Цикл
сообщить(Элемент1.ИмяУзла);
Для ДокументDOM нет события конца чтения. Весь файл сразу прочитывается.
(10)Еще не все, мне нужно прочитать второй тег, я пере этим решим обрамить его общим, та к при записи он теряется, тега Body в конечном файле нет, и в результате я никак данные прочитать не могу.
текЗапрос.Send(XML);
текЗапрос.WaitForResponse();
Ответ = текЗапрос.ResponseText;
Ответ = "<Body>" + Ответ + "</Body>";
ПутьКФайлу = "D:\1.xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Ответ);
ЗаписьXML.Закрыть();
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
Построитель = Новый ПостроительDOM;
ОтветДокумент = Построитель.Прочитать(ЧтениеXML);
Для Каждого Элемент0 Из ОтветДокумент.ЭлементДокумента.ДочерниеУзлы Цикл
сообщить(Элемент0.ИмяУзла);
Если Элемент0.ИмяУзла = "#text" Тогда
//Сообщить(Элемент0.Атрибуты.ПолучитьИменованныйЭлемент("ErrorName"))
КонецЕсли
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот