|
v7: Поиск подчиненных узлов в xml | ☑ | ||
---|---|---|---|---|
0
Gugolovski
13.03.18
✎
03:59
|
Есть xml документ:
Корневой узел <Rasshifrovka> у него два подчиненных: <ApplicationArea> и <DataArea> Нужно добраться до подчиненных. У меня работает только если последовательно перебираюсь от верхнего к нижнему. Работает: //*************Способ 1 XMLParser = СоздатьОбъект("AddIn.XMLParser"); Документ =XMLParser.СоздатьДокумент(); Документ.Загрузить(ПолноеИмяФайла); Rasshifrovka = Документ.ВыбратьУзел("Rasshifrovka"); Для сч = 1 По Rasshifrovka.КоличествоПодчиненных() Цикл подчиненный= Rasshifrovka.ПолучитьПодчиненныйПоНомеру(сч); Сообщить(подчиненный.Наименование); КонецЦикла; //******************** Если пробую искать подчиненный через "ВыбратьУзел()" выдает ошибку: :Значение не представляет агрегатный объект (Наименование) //*************Способ 2 Документ =XMLParser.СоздатьДокумент(); Документ.Загрузить(ПолноеИмяФайла); ApplicationArea= Документ.ВыбратьУзел("ApplicationArea"); Сообщить(ApplicationArea.Наименование); //******************** и через "ВыбратьУзлы()" не выходит //*************Способ 3 Документ =XMLParser.СоздатьДокумент(); Документ.Загрузить(ПолноеИмяФайла); ApplicationArea = Документ.ВыбратьУзлы("ApplicationArea"); Для сч = 0 По ApplicationArea.КоличествоУзлов()-1 Цикл Элемент = ApplicationArea.ПолучитьУзел(Сч); Сообщить(Элемент.Наименование); КонецЦикла; //******************** Можно ли быстро добраться до подчинненых элементов по имени не восстанавливая все дерево подчинения? |
|||
1
Рэйв
13.03.18
✎
06:10
|
как ты себе это представляешь? Понять что они подчиненные можно как раз только "восстанавливая все дерево подчинения"
|
|||
2
big
13.03.18
✎
06:18
|
По поводу способов 2 и 3. Какой msxml в системе присутствует? Если это НЕ версия 3, то v7plus нормально работать не будет.
Переходите на DOMDocument, там всё работает правильно. selectSingleNode, selectNodes. Поверьте, потратив немного времени на изучение, уже не будете бороться непонятно с чем |
|||
3
spectre1978
13.03.18
✎
06:39
|
Хм, а xpath что, отменили? Можно же в выбратьузлы выражение через / написать для выбора подчинённых.
|
|||
4
Gugolovski
13.03.18
✎
06:41
|
(2) msxml 3-й. Вчера переустановливал).
Готов изучать DOMDocument, напрвление не зададите? Нужно что либо доустанавливать? В описании встроенного языка на встречал подобного |
|||
5
бомболюк
13.03.18
✎
07:58
|
||||
6
big
13.03.18
✎
08:02
|
||||
7
Slypower
13.03.18
✎
09:04
|
Пример (Через dom = Новый COMОбъект("MSXML2.DOMDocument"); ):
Функция ДанныеАтрибута(Узел,Атрибут) Попытка если Узел=ТекУзел Тогда Данные=СокрЛП(ТекУзел.selectSingleNode(Атрибут).text); ИначеЕсли Узел=dom Тогда Данные=СокрЛП(dom.documentElement.selectNodes(Атрибут).item(0).text); ИначеЕсли Узел=obj2 Тогда Данные=obj2.getAttribute(Атрибут); Иначе Предупреждение("Не найден узел "+Атрибут ); КонецЕсли; Исключение Данные=""; КонецПопытки; Возврат Данные; КонецФункции // ДанныеАтрибута Процедура Использования() dom.load(файл); //Сообщить(файл); //Шапка Макет2.Параметры.doc_docType_description=ДанныеАтрибута(dom,"deliveryCondition/description"); //Товар Строки=dom.documentElement.selectSingleNode("roster"); номер=0; Кол=Строки.childNodes.length; Для Счетчик=0 По Кол-1 Цикл ТекУзел=Строки.childNodes.item(Счетчик); номер=номер+1; Макет2.Параметры.name=ДанныеАтрибута(ТекУзел,"name"); КонецЦикла; КонецПроцедуры |
|||
8
Slypower
13.03.18
✎
09:08
|
Файл:
//Товар <roster totalCostVat="2517552.00" totalExcise="0" totalVat="419593.00" totalCost="2097959.00"> <rosterItem> <number>0</number> </rosterItem> </roster> //Шапка <deliveryCondition> <contract> <number>договор 189 от 08.02.2011</number> <date>2011-02-08</date> <documents> <document> <docType> <code>603</code> </docType> <date>2015-09-01</date> <blankCode>402861</blankCode> <seria>БР</seria> <number>3402474</number> </document> </documents> </contract> </deliveryCondition> |
|||
9
big
13.03.18
✎
09:39
|
(7) Бывает, что от некоторых поставщиков нужного атрибута (узла) нет в файле данных, я сделал через такие функции
Функция ПолучитьЗначениеУзлаПоИмени(Узел,Имя) Результат = ПолучитьПустоеЗначение("Строка"); Если Узел = "" Тогда Возврат Результат; КонецЕсли; Если Узел.getElementsByTagName(Имя).length>0 Тогда Результат = Узел.getElementsByTagName(Имя).Item(0).Text; КонецЕсли; Возврат Результат; КонецФункции Функция ПолучитьУзелПоИмени(Узел,Имя) Результат = ПолучитьПустоеЗначение("Строка"); Если Узел = "" Тогда Возврат Результат; КонецЕсли; Если Узел.getElementsByTagName(Имя).length>0 Тогда Результат = Узел.getElementsByTagName(Имя).Item(0); КонецЕсли; Возврат Результат; КонецФункции |
|||
10
Gugolovski
14.03.18
✎
03:18
|
(2) (6) спасибо за совет и ссылку.
С DOM куда яснее и функционал пошире)). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |