Имя: Пароль:
1C
1C 7.7
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 куда яснее и функционал пошире)).
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан