Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Разбор xpath 1c

Разбор xpath 1c
Я
   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]

Что Я делаю не так?
   Kassern
 
1 - 30.09.21 - 10:24
(0) в переменной Ответ у вас что?
   yyyuuu
 
2 - 30.09.21 - 10:26
(1)сам текст XML
   Kassern
 
3 - 30.09.21 - 10:33
(0) ну так ошибка то какая в чем проблема?
   youalex
 
4 - 30.09.21 - 10:33
у меня вот так находит:
getInvoiceReply/invCar/carNumber
   yyyuuu
 
5 - 30.09.21 - 10:34
(3)
Ошибок нет, не читает нехрена.
   Kassern
 
6 - 30.09.21 - 10:34
СП: Если выражение XPath содержит ошибки или в процессе вычисления выражения не удалось разыменовать префикс пространства имен, то будет вызвано исключение.
   youalex
 
7 - 30.09.21 - 10:35
invCar еще узел в модели.
   yyyuuu
 
8 - 30.09.21 - 10:35
(4) Странно у Меня нет. А если из тега getInvoiceReply хочу получить значение?
   youalex
 
9 - 30.09.21 - 10:36
(8) так ты можешь сразу нужный путь указать к нужным элементам, из контекста ДокументDOM
   yyyuuu
 
10 - 30.09.21 - 10:41
(9)
РезультатgetInvoiceReply = ДокументDOM.ВычислитьВыражениеXPath("getInvoiceReply",ДокументDOM.ЭлементДокумента,Разименователь);
ЭлементgetInvoiceReply = РезультатgetInvoiceReply.ПолучитьСледующий();
ЭлементgetInvoiceReplyВагон = ДокументDOM.ВычислитьВыражениеXPath
        ("getInvoiceReply",ЭлементgetInvoiceReply,Разименователь).ПолучитьСледующий();
        Если ЭлементgetInvoiceReplyВагон <> Неопределено Тогда
            //

            InvoiceReply.carNumber = ЭлементgetInvoiceReplyВагон;
            //

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.