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