Имя: Пароль:
1C
1С v8
8.2 УФ Чтение данных из xml файла
0 Кукалёв Анатолий
 
21.03.12
04:25
Сервер возвращает данные вида:
<?xml version="1.0" encoding="UTF-8"?>
<request>
<message id="1">ТекстСообщения</message>
<message id="2">Ошибка</message>
<message id="3">ТекстСообщения</message>
...
</request>

1) Как проверить, что имеется блок "request" ?
2) При положительном ответе на 1) как пройтись по всем блокам "message" получив значение "id" и "ТекстСообщения" ?
1 0xFFFFFF
 
21.03.12
06:57
ЧтениеХМЛ = Новый ЧтениеXML;
   ЧтениеХМЛ.ОткрытьФайл(ИмяФайла);
   Пока ЧтениеХМЛ.Прочитать() Цикл
       Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
           Если (ЧтениеХМЛ.Имя = "request") Тогда
               Пока ЧтениеХМЛ.Прочитать() Цикл
                   Если (ЧтениеХМЛ.Имя = "message") Тогда
                       id = ЧтениеХМЛ.ПолучитьАтрибут("id");
                   КонецЕсли;
                   Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.КонецЭлементаТогда
                       Прервать;//закончился узел с данными документа
                   КонецЕсли;
               КонецЦикла;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
       
Как то так
2 0xFFFFFF
 
21.03.12
06:59
Ну а для "ТекстСообщения", "Ошибка" - нужно вроде юзать
ЧтениеХМЛ.Значение
Для соответствующего элемента
3 Кукалёв Анатолий
 
21.03.12
13:50
ЧтениеХМЛ    = Новый ЧтениеXML;
           ЧтениеХМЛ.ОткрытьФайл(ИмяФайла);
           
           Пока ЧтениеХМЛ.Прочитать() Цикл
               Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                   Если ЧтениеХМЛ.Имя = "request" Тогда
                       Пока ЧтениеХМЛ.Прочитать() Цикл
                           Если ЧтениеХМЛ.Имя = "message" И ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                               mid        = ЧтениеХМЛ.ПолучитьАтрибут("id");
                               mtxt    = ЧтениеХМЛ.Значение;
                               ДокТест.ДобавитьСтроку("id:"+mid+", txt:"+mtxt+".");
                           КонецЕсли;
                       КонецЦикла;
                   КонецЕсли;
               КонецЕсли;
           КонецЦикла;

mid - все получает, а вот mtxt - всегда пустое значение. Что не так ?
4 GenV
 
21.03.12
14:04
(3) Что бы прочитать значение нужно добавить еще внутренний цикл с Прочитать() (завершение по получение конца элемента "request") и сравнением ЧтениеХМЛ.ТипУзла = ТипУзлаXML.Текст, тогда можно получать значение
5 GenV
 
21.03.12
14:10
4+ можно и проще, если использовать ПрочитатьXML(ЧтениеХМЛ, Тип("Строка"))
6 Кукалёв Анатолий
 
21.03.12
14:27
Сделал так, все получает даже если сообщение пустое:

ЧтениеХМЛ    = Новый ЧтениеXML;
           ЧтениеХМЛ.ОткрытьФайл(ИмяФайла);
           
           Пока ЧтениеХМЛ.Прочитать() Цикл
               Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                   Если ЧтениеХМЛ.Имя = "request" Тогда
                       Пока ЧтениеХМЛ.Прочитать() Цикл
                           Если ЧтениеХМЛ.Имя = "message" И ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                               mid        = ЧтениеХМЛ.ПолучитьАтрибут("id");
                               ЧтениеХМЛ.Прочитать();
                               mtxt    = ЧтениеХМЛ.Значение;
                               ДокТест.ДобавитьСтроку("id:"+mid+", txt:"+mtxt+".");
                           КонецЕсли;
                       КонецЦикла;
                   КонецЕсли;
               КонецЕсли;
           КонецЦикла;
7 Кукалёв Анатолий
 
21.03.12
14:27
Спасибо всем