Имя: Пароль:
1C
1С v8
Как правильно прочитать XML документ
0 Маленький Вопросик
 
23.09.11
08:14
Есть документ такой структуры:

ROOT
|-организация
|-контрагент
|-табличная часть
 |-строка

собственно сабж
1 zak555
 
23.09.11
08:15
из 1с выгружал ?
2 andrewks
 
23.09.11
08:16
(0) сериализация?
3 Маленький Вопросик
 
23.09.11
08:17
(1) да, собственная выгрузка типа такой:

   ДанныеXML.ЗаписатьНачалоЭлемента("ДополнительныеДанные");
       ДанныеXML.ЗаписатьНачалоЭлемента("ДатаДок");
       ДанныеXML.ЗаписатьТекст(Строка(ЭтаФорма.ДатаДок));
       ДанныеXML.ЗаписатьКонецЭлемента();
       ДанныеXML.ЗаписатьНачалоЭлемента("НомерДок");
       ДанныеXML.ЗаписатьТекст(ЭтаФорма.НомерДок);
       ДанныеXML.ЗаписатьКонецЭлемента();
   ДанныеXML.ЗаписатьКонецЭлемента();
4 Маленький Вопросик
 
23.09.11
08:18
(2) примерчик бы... чето не могу найти с подчиненными элементами...
5 zak555
 
23.09.11
08:18
(3) можно выгрузать-загружать не парясь с ручной выгрузкой-загрузкой

кури (2)
6 Kookish
 
23.09.11
08:19
(4) Книгу "Технологии интеграции 1С:Предприятия 8.2" не предлагать?
7 andrewks
 
23.09.11
08:20
(4) ты задачу озвучь для начала
8 Маленький Вопросик
 
23.09.11
08:21
(7) загрузить в форму данные из xml документа. на форме есть как реквизиты так и табличные части
9 andrewks
 
23.09.11
08:23
(8) хмл-файл произвольный, или выгружаешь из соседней базы?
тебе обмен нужен между базами 1С, или произвольная загрузка?
10 Маленький Вопросик
 
23.09.11
08:24
(9) произвольная, подчинения как в (0)
11 Маленький Вопросик
 
23.09.11
08:27
я нашел что-то подобное, но там нет подчиненных узлов:

СтруктураПараметров=Новый Структура;
   СтруктураПараметров.Вставить("Height"    ,10);
   СтруктураПараметров.Вставить("Width"    ,100);
   СтруктураПараметров.Вставить("Length"    ,10);
   СтруктураПараметров.Вставить("Depth"    ,10);
   
   ЧтениеXML = Новый ЧтениеXML;
   ЧтениеXML.ОткрытьФайл("bla bla bla");
   
   Пока ЧтениеXML.Прочитать()Цикл
       ИмяУзла = ЧтениеXML.ЛокальноеИмя;
       Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
           
           Если ИмяУзла = "Height"
               ЧтениеXML.Прочитать();
               СтруктураПараметров.Height  = ПолучитьТекстЭлементаХМЛ(ЧтениеXML);
               Продолжить;
           КонецЕсли;
           
           Если ИмяУзла = "Width"
               ЧтениеXML.Прочитать();
               СтруктураПараметров.Width  = ПолучитьТекстЭлементаХМЛ(ЧтениеXML);
               Продолжить;
           КонецЕсли;
           
           Если ИмяУзла = "Length"
               ЧтениеXML.Прочитать();
               СтруктураПараметров.Length  = ПолучитьТекстЭлементаХМЛ(ЧтениеXML);
               Продолжить;
           КонецЕсли;
           
           Если ИмяУзла = "Depth"
               ЧтениеXML.Прочитать();
               СтруктураПараметров.Depth  = ПолучитьТекстЭлементаХМЛ(ЧтениеXML);
               Продолжить;
           КонецЕсли;
           
       КонецЕсли;
   КонецЦикла;    
   
   Возврат(СтруктураПараметров);
12 Mironoff
 
23.09.11
08:31
мне удобней через DOM:
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл(ИмяФайла);
       
ПостроительДом = Новый ПостроительDOM();
Попытка
мДокументДОМ = ПостроительДом.Прочитать(ЧтениеХМЛ);
Исключение
Предупреждение(ОписаниеОшибки(),, "Ошибка при чтении файла XML");
КонецПопытки;
13 Mironoff
 
23.09.11
08:31
А потом Для Каждого ЭлементДОМ Из мДокументДОМ.ПолучитьЭлементыПоИмени("организация") Цикл и т.д.
14 andrewks
 
23.09.11
08:36
Попытка
       //ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");

       ДОМ=СоздатьОбъект("MSXML2.DOMDocument");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   
   ДОМ.async=0;
   ДОМ.validateOnParse=-1;
   ДОМ.resolveExternals=-1;
   ДОМ.load(ИмяФайла);
   
   Если (ДОМ.parseError.errorCode<>0) Тогда
       // ошибки при проверке валидности

       Сообщить("При проверке валидности файла "+ИмяФайла+" выявлены ошибки!","!");
       Возврат 0;
   КонецЕсли;
   
   Элем1=ДОМ.getElementsByTagName("Корневой").item(0);
   
   Для ном=0 По Элем1.childNodes.length-1 Цикл
       ДочЭлем=Элем1.childNodes(ном);
       
       Если (ДочЭлем.nodeType=1) Тогда
           Сообщить("Атрибут Сумма = "+ДочЭлем.getAttribute("Сумма"));
       КонецЕсли;
   КонецЦикла;

на 8-ку сам портани, тут исправлений минимум надо
15 Маленький Вопросик
 
23.09.11
08:37
(13) щас попробуем
16 Mironoff
 
23.09.11
08:43
(15)
Для тч надо по вложенным бегать, в отладчике в принципе все видно.
Для Каждого ВложенныйЭлементДОМ Из ЭлементДОМ.ПолучитьЭлементыПоИмени("Строка") Цикл                
Наименование = ВложенныйЭлементДОМ.ПолучитьЭлементыПоИмени("Наименование").Элемент(0).ТекстовоеСодержимое;
               
               
           КонецЦикла;
17 Маленький Вопросик
 
23.09.11
08:51
(16) да, получилось

ДанныеXML = Новый ЧтениеXML;    
Попытка
  ДанныеXML.ОткрытьФайл(ПутьКФайлуДанных);
Исключение
  Сообщить("Невозможно открыть xml-файл");
  Возврат;
КонецПопытки;    

ПостроительДом = Новый ПостроительDOM();
ДанныеDOM = ПостроительДом.Прочитать(ДанныеXML);

Для Каждого ЭлементDOM ИЗ ДанныеDOM.ПолучитьЭлементыПоИмени("Организация") Цикл
    ОрганизацияПолноеНаименование = ЭлементDOM.ПолучитьЭлементыПоИмени("ОрганизацияПолноеНаименование").Элемент(0).ТекстовоеСодержимое;
КонецЦикла;

а ничего, что у меня это все еще и в ROOT обернуто?
18 Маленький Вопросик
 
23.09.11
08:55
а если быть точным, то структура документа такая:

http://s2.ipicture.ru/uploads/20110923/RKp7oRt8.jpg
19 andrewks
 
23.09.11
08:59
(17) не вижу никаких проблем
20 Mironoff
 
23.09.11
09:02
(17) В том то и прелесть DOM, ты можешь прыгать сразу в нужную тебе ветку, минуя обход всего дерева
21 Маленький Вопросик
 
23.09.11
09:02
(19) меня смущает просто цикл для каждого и поиск по наименованию...

мне бы хотелось записть как-то так

Наименование = Root.Организация.ПолноеНаименование...
22 Маленький Вопросик
 
23.09.11
09:03
у меня могут быть ветки с одинаковыми названиями, но подчинены разным элементам
23 andrewks
 
23.09.11
09:04
ну ты разбирай хмл _структурно_
24 zak555
 
23.09.11
09:05
сериализация чем не подходит ?
25 Маленький Вопросик
 
23.09.11
09:05
(23) не могу пока найти, как это правильно сделать в рамках 1с...
26 andrewks
 
23.09.11
09:06
(24) ну, видимо данные идут не из 1С. или из совсем другой конфы
27 Маленький Вопросик
 
23.09.11
09:20
Ну вот как-то так получилось (со строками таб части). вроде все работает...

Для Каждого ЭлементDOM ИЗ ДанныеDOM.ПолучитьЭлементыПоИмени("ДанныеДокумента") Цикл
    Для Каждого СтрокаDOM ИЗ ЭлементDOM.ПолучитьЭлементыПоИмени("СрокаДокумента") Цикл
       НоваяСтрока = ДанныеДокумента.Добавить();
       НоваяСтрока.Код  = СтрокаDOM.ПолучитьЭлементыПоИмени("Код").Элемент(0).ТекстовоеСодержимое;
       НоваяСтрока.Наименование = СтрокаDOM.ПолучитьЭлементыПоИмени("Наименование").Элемент(0).ТекстовоеСодержимое;
       
    КонецЦикла;
КонецЦикла;
28 Маленький Вопросик
 
23.09.11
09:22
ладно, пусть будет пока так как в (27)
Основная теорема систематики: Новые системы плодят новые проблемы.