Разбор XML

1. Dark1412 14.08.19 13:42 Сейчас в теме
Доброго всем дня, возникла следующая проблема, идёт разбор XML с помощью следующего кода:
ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(АдресФайла);
	РезультатРазборки = Новый Массив;
	ТипПриходныйОрдерXDTO = ФабрикаXDTO.Тип("http://localhost/testXML","table");
	ПоказанияКан = 0;
	Пока ЧтениеXML.Прочитать() Цикл
		Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "messages" Цикл 
			ДокументXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипПриходныйОрдерXDTO);
			Если ДокументXDTO.count = "1" Тогда
				Если НЕ ДокументXDTO.message.Свойства().Получить("engine_temp") = Неопределено Тогда
					ПоказанияКан = ДокументXDTO.message.can_mileage;
					Если ПервоеСообщение Тогда
						Прервать;
					КонецЕсли; 
				КонецЕсли; 
			Иначе
				Для каждого ТС Из ДокументXDTO.message Цикл
					Если НЕ ТС.Свойства().Получить("engine_temp") = Неопределено  Тогда
						ПоказанияКан = ТС.can_mileage;
						Если ПервоеСообщение Тогда
							Прервать;
						КонецЕсли; 
					КонецЕсли; 
				КонецЦикла; 
			КонецЕсли; 
		КонецЦикла;
		
	КонецЦикла;
	
	возврат ПоказанияКан;
Показать


Получаем значение КАН из тега can_mileage, но иногда обработка цепляет can_mileage в отрицательном значении, вероятно из-за того что оно приходит из запроса первым, 3 недели бьюсь, не могу модифицировать для отсеивания отрицательных значений. Пример Данных из запроса XML в прикреплённом файле.
Заранее благодарю за любую помощь.
Прикрепленные файлы:
services.wialon.by.xml
По теме из базы знаний
Найденные решения
15. spacecraft 14.08.19 16:15 Сейчас в теме
(14) значит полученный xml не имеет результата и скорее всего с ошибкой(ошибка не в синтаксисе, а возврат ошибки). Проверьте входящий xml.
Конечно нужно от таких ситуаций проверять, что result есть.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
10. spacecraft 14.08.19 15:55 Сейчас в теме
(1) нужно вернуть первое положительное значение can_mileage?
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(АдресФайла);
ДокументXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
messages = ДокументXDTO.result.items.item.messages.message;
Для Каждого message Из messages Цикл
    Если Число(message.can_mileage) > 0 Тогда
		Возврат message.can_mileage;
	КонецЕсли;
КонецЦикла;
Возврат 0;
Показать
11. Dark1412 14.08.19 16:00 Сейчас в теме
(10)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(АдресФайла);
ДокументXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
messages = ДокументXDTO.result.items.item.messages.message;
Если messages.Количество() > 0 Тогда
Для Каждого message Из messages Цикл
Если Число(message.can_mileage) > 0 Тогда
Возврат message.can_mileage;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат 0;
Хм, а как его встроить в обработку, мне нужно чтобы ПоказанияКан = ДокументXDTO.message.can_mileage;
12. spacecraft 14.08.19 16:03 Сейчас в теме
(11) ПоказанияКан это тоже что и message.can_mileage в приведенном мной коде.
Я основывался на приведенный код в (0).
14. Dark1412 14.08.19 16:13 Сейчас в теме
(12){Обработка.ЗагрузкаВиалон.МодульОбъекта(203)}: Поле объекта не обнаружено (result)
messages = ДокументXDTO.result.items.item.messages.message;

(12)
15. spacecraft 14.08.19 16:15 Сейчас в теме
(14) значит полученный xml не имеет результата и скорее всего с ошибкой(ошибка не в синтаксисе, а возврат ошибки). Проверьте входящий xml.
Конечно нужно от таких ситуаций проверять, что result есть.
13. spacecraft 14.08.19 16:08 Сейчас в теме
(11) если в (0) не полный код и нужно в него встроить, тогда так:
	ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(АдресФайла);
    РезультатРазборки = Новый Массив;
    ТипПриходныйОрдерXDTO = ФабрикаXDTO.Тип("http://localhost/testXML","table");
    ПоказанияКан = 0;
    Пока ЧтениеXML.Прочитать() Цикл
        Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "messages" Цикл 
            ДокументXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипПриходныйОрдерXDTO);
            Если ДокументXDTO.count = "1" Тогда
                Если НЕ ДокументXDTO.message.Свойства().Получить("engine_temp") = Неопределено И Число(ДокументXDTO.message.can_mileage) > 0 Тогда
                    ПоказанияКан = ДокументXDTO.message.can_mileage;
                    Если ПервоеСообщение Тогда
                        Прервать;
                    КонецЕсли; 
                КонецЕсли; 
            Иначе
                Для каждого ТС Из ДокументXDTO.message Цикл
                    Если НЕ ТС.Свойства().Получить("engine_temp") = Неопределено И Число(ДокументXDTO.message.can_mileage) > 0 Тогда
                        ПоказанияКан = ТС.can_mileage;
                        Если ПервоеСообщение Тогда
                            Прервать;
                        КонецЕсли; 
                    КонецЕсли; 
                КонецЦикла; 
            КонецЕсли; 
        КонецЦикла;
        
    КонецЦикла;
    
    возврат ПоказанияКан;
Показать

Только учите, что can_mileage это строка. Для получения числа нужно приводить к числу.
16. Dark1412 14.08.19 16:20 Сейчас в теме
(13) Заработало, но всё равно берёт отрицательное значение.
17. spacecraft 14.08.19 16:23 Сейчас в теме
(16) значит помимо приведенного кода там еще что-то есть.
только по приведенному коду отрицательных чисел быть не должно
18. Dark1412 14.08.19 17:21 Сейчас в теме
(17) А елси попробовать перед обработкой почистить Xml от тегов с отрицательными значениями ? Может поможет ? И есть ли идеи как лучше это сделать ?
2. platonov.e 158 14.08.19 13:49 Сейчас в теме
Что то ничего не понятно. В can_mileage у вас? Число? И когда оно отрицательное то?
3. Dark1412 14.08.19 14:04 Сейчас в теме
В can_mileage число, показания одометра, если обработка захватывает его то в документ приходит отрицательный пробег.
4. platonov.e 158 14.08.19 14:08 Сейчас в теме
(3) и что нужно чтобы делать если там отрицательное значение?
5. Dark1412 14.08.19 14:13 Сейчас в теме
(4) Чтобы он искал следующее, уже положительное значение.
6. tvm 14.08.19 14:13 Сейчас в теме
(1) попробуйте так:

 
Если НЕ ТС.Свойства().Получить("engine_temp") = Неопределено  Тогда
        ПоказанияКан = ТС.Свойства().Получить("ТС.can_mileage");
        Если ПервоеСообщение Тогда
                 Прервать;
        КонецЕсли; 
 КонецЕсли; 
7. Dark1412 14.08.19 14:39 Сейчас в теме
(6) Преобразование значения к типу Число не может быть выполнено
8. tvm 14.08.19 15:06 Сейчас в теме
(7) а в отладчике ТС.Свойства() что показывает?
9. Dark1412 14.08.19 15:48 Сейчас в теме
(8) ДокументXDTO.message.can_mileage - число

(8)ТС.Свойства() ничего,
Самая большая проблема что обработку не я писал.
Оставьте свое сообщение

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