Как разобрать XML файл содержащий атрибуты

1. antipod13 25.04.20 09:32 Сейчас в теме
Везде описания для файлов только из элементов, а у меня и атрибуты есть, причем описания нет и ответ с ошибками отличается от ответа правильного
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
13. independ 1520 25.04.20 17:58 Сейчас в теме
(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.Закрыть();
	
КонецПроцедуры
Показать
14. antipod13 25.04.20 18:02 Сейчас в теме
(13Это я только первый запрос к сервису разбираю, если я все построчно разбирать буду, я умру
15. independ 1520 25.04.20 18:10 Сейчас в теме
(14) содержимое файла можно увидеть?
16. antipod13 25.04.20 18:12 Сейчас в теме
(15)Ниже то что получаю, в самом начале выложил
2. antipod13 25.04.20 13:27 Сейчас в теме
вот что у меня сейчас, это код
Построитель = Новый Построитель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>
3. ImHunter 315 25.04.20 13:31 Сейчас в теме
Если используете ЧтениеXML, то см. его методы КоличествоАтрибутов(), ПрочитатьАтрибут().
4. ImHunter 315 25.04.20 13:39 Сейчас в теме
Для ДокументDOM - тоже есть св-во Атрибуты. Чет не пойму, в чем сложность-то...
5. antipod13 25.04.20 13:57 Сейчас в теме
(4)да куча сложностей, во первых
 Для Каждого Элемент0 Из ОтветДокумент.ЭлементДокумента.ДочерниеУзлы Цикл

их моего файла видит только один элемент, заголовок, второй не видит, может не ЭлементДокумента
второе
Элемент0.Атрибуты.ПолучитьИменованныйЭлемент("ErrorName"

пишет нет такого, с ваших же ресурсо примеры брал
6. ImHunter 315 25.04.20 14:04 Сейчас в теме
(5) Насчет
их моего файла видит только один элемент, заголовок, второй не видит, может не ЭлементДокумента
второе

Ну правильно, видит только один элемент. А у этого элемента есть свои ДочерниеУзлы.
Улавливаете мысль?
7. antipod13 25.04.20 14:06 Сейчас в теме
(6)первое - а что надо то, скопировал же
второе, я не правильно написал, он пишет что метода такого нет а не атрибута
8. ImHunter 315 25.04.20 14:15 Сейчас в теме
(7) Надо рекурсивно разбирать содержимое. Ведь каждый узел - это ДокументDOM, со своими атрибутами и дочерними узлами.
В приведенном коде разбирается только содержание узла самого верхнего уровня.
9. antipod13 25.04.20 14:19 Сейчас в теме
(8)Э, то есть надо последовательно все Элементы перебрать в
ОтветДокумент = Построитель.Прочитать(ЧтениеXML);

это строка считывает один элемент, а как узнать конец файла?
10. ImHunter 315 25.04.20 14:43 Сейчас в теме
(9) Не последовательно, а рекурсивно. Или с пониманием, что разбирается иерархия.
ОтветДокумент = Построитель.Прочитать(ЧтениеXML); - прочитывает только элемент верхнего уровня.
Чтобы узнать его дочерние узлы - нужен вложенный цикл. Типа:
    Для Каждого Элемент0 Из ОтветДокумент.ЭлементДокумента.ДочерниеУзлы Цикл
        сообщить(Элемент0.ИмяУзла);
        Для Каждого Элемент1 Из Элемент0.ДочерниеУзлы Цикл
            сообщить(Элемент1.ИмяУзла);

Для ДокументDOM нет события конца чтения. Весь файл сразу прочитывается.
11. antipod13 25.04.20 17:24 Сейчас в теме
(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"))
		КонецЕсли
	КонецЦикла;
Показать
12. antipod13 25.04.20 17:31 Сейчас в теме
Dody опечатка, исправленный код тоже не работает
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот