|   |   | 
| 
 | Разбор 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) спасибо     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |