Имя: Пароль:
1C
1С v8
Разбор xpath 1c
, , , ,
0 yyyuuu
 
30.09.21
10:17
Всем привет ребята. Вопрос. Хочу разобрать [URL=https://dropmefiles.com/kHZA4]XML[/URL]

[CODE]Если ЭлементgetInvoiceReplyВагон <> Неопределено Тогда[/CODE]
Тут сразу получаю Неопределено
Весь код
[CODE]
    
    
    ЧтениеХМЛ = новый ЧтениеXML;
    ЧтениеХМЛ.УстановитьСтроку(Ответ);
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеХМЛ);
    
    РезультатРазборки = Новый Массив;
    
    Разименователь = Новый РазыменовательПространствИменDOM(ДокументDOM);
    
    РезультатgetInvoiceReply = ДокументDOM.ВычислитьВыражениеXPath("getInvoiceReply",ДокументDOM.ЭлементДокумента,Разименователь);
    
    Пока Истина Цикл
        //
        ЭлементgetInvoiceReply = РезультатgetInvoiceReply.ПолучитьСледующий();
        Если ЭлементgetInvoiceReply = Неопределено Тогда
            Прервать;
        КонецЕсли;
        
        InvoiceReply = Новый Структура("carNumber,Tariff,Грузополучатель");
        
        ЭлементgetInvoiceReplyВагон = ДокументDOM.ВычислитьВыражениеXPath
        ("carNumber",ЭлементgetInvoiceReply,Разименователь).ПолучитьСледующий();
        Если ЭлементgetInvoiceReplyВагон <> Неопределено Тогда
            //
            InvoiceReply.carNumber = ЭлементgetInvoiceReplyВагон;
            //
        КонецЕсли;    
        
        //
    КонецЦикла;    
[/CODE]

Что Я делаю не так?
1 Kassern
 
30.09.21
10:24
(0) в переменной Ответ у вас что?
2 yyyuuu
 
30.09.21
10:26
(1)сам текст XML
3 Kassern
 
30.09.21
10:33
(0) ну так ошибка то какая в чем проблема?
4 youalex
 
30.09.21
10:33
у меня вот так находит:
getInvoiceReply/invCar/carNumber
5 yyyuuu
 
30.09.21
10:34
(3)
Ошибок нет, не читает нехрена.
6 Kassern
 
30.09.21
10:34
СП: Если выражение XPath содержит ошибки или в процессе вычисления выражения не удалось разыменовать префикс пространства имен, то будет вызвано исключение.
7 youalex
 
30.09.21
10:35
invCar еще узел в модели.
8 yyyuuu
 
30.09.21
10:35
(4) Странно у Меня нет. А если из тега getInvoiceReply хочу получить значение?
9 youalex
 
30.09.21
10:36
(8) так ты можешь сразу нужный путь указать к нужным элементам, из контекста ДокументDOM
10 yyyuuu
 
30.09.21
10:41
(9)
РезультатgetInvoiceReply = ДокументDOM.ВычислитьВыражениеXPath("getInvoiceReply",ДокументDOM.ЭлементДокумента,Разименователь);
ЭлементgetInvoiceReply = РезультатgetInvoiceReply.ПолучитьСледующий();
ЭлементgetInvoiceReplyВагон = ДокументDOM.ВычислитьВыражениеXPath
        ("getInvoiceReply",ЭлементgetInvoiceReply,Разименователь).ПолучитьСледующий();
        Если ЭлементgetInvoiceReplyВагон <> Неопределено Тогда
            //
            InvoiceReply.carNumber = ЭлементgetInvoiceReplyВагон;
            //
        КонецЕсли;    
Не работает. И ошибок нету. И доступа к элементам
11 yyyuuu
 
30.09.21
10:42
РезультатgetInvoiceReply = ДокументDOM.ВычислитьВыражениеXPath("getInvoiceReply",ДокументDOM.ЭлементДокумента,Разименователь);
ЭлементgetInvoiceReply = РезультатgetInvoiceReply.ПолучитьСледующий();
        Если ЭлементgetInvoiceReply = Неопределено Тогда
            Прервать;
        КонецЕсли;
Делаю проверку на неопределенно, чтобы выйти из цикла. Сюда сразу падает неопределенно
12 Kassern
 
30.09.21
10:45
(0) а зачем так в цикле обходить с прерыванием? Почему нельзя напрямую обратиться к массиву и обойти все его элементы?
13 youalex
 
30.09.21
10:45
СтрокаЗапроса = "/getInvoiceReply/invCar/carNumber";
Результат = документДОМ.ВычислитьВыражениеXPath(СтрокаЗапроса, документДОМ, Новый РазыменовательПространствИменDOM(документДОМ));
14 yyyuuu
 
30.09.21
10:46
(12) проблема в нехватке знаний. Знаю как вот так делать. Если есть пример, поделись
15 Kassern
 
30.09.21
10:57
(14) можно в дерево значений загнать XML, а потом удобно читать, можно еще проще через фабрику сделать как например тут: https://infostart.ru/public/311011/
Там пример с  ФабрикаXDTO.ПрочитатьXML();
16 yyyuuu
 
30.09.21
10:59
(15)Да Я видел. Но хотел через xpath попробовать. Не могу найти примеров, все как по учебнику делаю а все ровно не получаю доступ к тегам после getInvoiceReply
17 youalex
 
30.09.21
11:01
(16) (13) попробуй
18 yyyuuu
 
30.09.21
12:34
(17) Результат пустой.
19 eklmn
 
гуру
30.09.21
14:17
нипанятно что ты хочешь, но закину сюда результат, а там думай дальше
https://cdn1.savepice.ru/uploads/2021/9/30/501d512e73a19c4b282dcf2d07242a12-full.png
20 yyyuuu
 
05.10.21
05:31
(19)
Я  вобще хочу разобрать то что в тегах -<getInvoiceReply> и +<invCar>
21 yyyuuu
 
06.10.21
03:50
Вроде разобрался с getInvoiceReply а как перебрать узлы <invCar> их от 4 до 5 бывает
22 yyyuuu
 
06.10.21
04:18
РезультатgetInvCar = ДокументDOM.ВычислитьВыражениеXPath("//getInvoiceReply/invCar",ДокументDOM.ЭлементДокумента,Разименователь);

        ЭлементInvCar = РезультатgetInvCar.ПолучитьСледующий();
        
        ЭлементgetInvoiceReplyНомВаг = ДокументDOM.ВычислитьВыражениеXPath
        ("//carNumber",ЭлементInvCar,Разименователь).ПолучитьСледующий();
        
        ЭлементgetInvoiceReplyНомВаг = ДокументDOM.ВычислитьВыражениеXPath
        ("//getInvoiceReply/invCar/*",ЭлементInvCar,Разименователь).ПолучитьСледующий();
        
        Пока ЭлементgetInvoiceReplyНомВаг <> Неопределено  Цикл
            //
            ЭлементgetInvoiceReplyНомВаг = ДокументDOM.ВычислитьВыражениеXPath
            ("//getInvoiceReply/invCar/carNumber",ЭлементInvCar,Разименователь).ПолучитьСледующий();

            InvoiceReply.invNumber =  ЭлементgetInvoiceReplyНомВаг.ПолучитьАтрибут("value");
            Сообщить(InvoiceReply.invNumber);
            ч = ч +1;
            Если ч>7 Тогда прервать; КонецЕсли;
            
            //
        КонецЦикла;

Пробую так перебать <invCar> их от 1-20 может быть. НЕ работает, попадаю всегда только на первый элемент первого тега <invCar>
23 yyyuuu
 
06.10.21
04:56
ЭлементЭлементgetInvoiceReply= ДокументDOM.ВычислитьВыражениеXPath("/getInvoiceReply",ДокументDOM.ЭлементДокумента,Разименователь);
        
        Если ЭлементЭлементgetInvoiceReply <> Неопределено тогда
            Пока Истина Цикл
                //
                InvoiceReply.invCar = Новый Массив;
                РезультатПоискgetInvoiceReply_invCar = ДокументDOM.ВычислитьВыражениеXPath("/invCar",ЭлементЭлементgetInvoiceReply,Разименователь);
                Пока Истина Цикл
                    //
                    Элемент_InvoiceReply_invCar = РезультатПоискgetInvoiceReply_invCar.ПолучитьСледующий();
                    Если Элемент_InvoiceReply_invCar = Неопределено Тогда
                        Прервать;
                    КонецЕсли;
                    
                    Строка_invCar = Новый Структура("сarNumber");
                    
                    Элемент_InvoiceReply_invCar_invCarNumber = ДокументDOM.ВычислитьВыражениеXPath("/carNumber",Элемент_InvoiceReply_invCar,Разименователь);
                    Если Элемент_InvoiceReply_invCar_invCarNumber <> Неопределено Тогда
                        Строка_invCar.сarNumber = Элемент_InvoiceReply_invCar_invCarNumber.ПолучитьАтрибут("value");                        
                    КонецЕсли;    
                    //
                КонецЦикла;    
                //
            КонецЦикла;
        КонецЕсли;


Ошибка по причине:
{ВнешняяОбработка.РазборХМЛ.МодульОбъекта(161)}: Ошибка при вызове метода контекста (ВычислитьВыражениеXPath)

по причине:
Несоответствие типов (параметр номер '2')
24 yyyuuu
 
06.10.21
08:14
(19) спасибо