Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Поиск подчиненных узлов в xml

v7: Поиск подчиненных узлов в xml
Я
   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
как ты себе это представляешь? Понять что они подчиненные можно как раз только "восстанавливая все дерево подчинения"
   big
 
2 - 13.03.18 - 06:18
По поводу способов 2 и 3. Какой msxml в системе присутствует? Если это НЕ версия 3, то v7plus нормально работать не будет.


Переходите на DOMDocument, там всё работает правильно.

selectSingleNode, selectNodes.

Поверьте, потратив немного времени на изучение, уже не будете бороться непонятно с чем
   spectre1978
 
3 - 13.03.18 - 06:39
Хм, а xpath что, отменили? Можно же в выбратьузлы выражение через / написать для выбора подчинённых.
   Gugolovski
 
4 - 13.03.18 - 06:41
(2) msxml  3-й. Вчера переустановливал).
Готов изучать DOMDocument, напрвление не зададите? Нужно что либо доустанавливать? В описании встроенного языка на встречал подобного
   бомболюк
 
5 - 13.03.18 - 07:58
   big
 
6 - 13.03.18 - 08:02
   Slypower
 
7 - 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");
КонецЦикла; 

КонецПроцедуры
   Slypower
 
8 - 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>
   big
 
9 - 13.03.18 - 09:39
(7) Бывает, что от некоторых поставщиков нужного атрибута (узла) нет в файле данных, я сделал через такие функции

Функция ПолучитьЗначениеУзлаПоИмени(Узел,Имя)
    Результат    = ПолучитьПустоеЗначение("Строка");
    Если Узел = "" Тогда
        Возврат Результат;
    КонецЕсли;
    Если Узел.getElementsByTagName(Имя).length>0 Тогда
        Результат    = Узел.getElementsByTagName(Имя).Item(0).Text;
    КонецЕсли;
    Возврат Результат;
КонецФункции

Функция ПолучитьУзелПоИмени(Узел,Имя)
    Результат    = ПолучитьПустоеЗначение("Строка");
    Если Узел = "" Тогда
        Возврат Результат;
    КонецЕсли;
    Если Узел.getElementsByTagName(Имя).length>0 Тогда
        Результат    = Узел.getElementsByTagName(Имя).Item(0);
    КонецЕсли;
    Возврат Результат;
КонецФункции
   Gugolovski
 
10 - 14.03.18 - 03:18
(2) (6) спасибо за совет и ссылку.
С DOM куда яснее и функционал пошире)).
 
 Рекламное место пустует

Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь можно задать вопрос "Как сделать?" и получить кучу ответов, что тебе это делать не надо. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует