|
Обход табличной части XML файла | ☑ | ||
---|---|---|---|---|
0
asder117
03.07.17
✎
23:22
|
Доброго времени суток.
Имеем файл такой конфигурации точнее его часть с элементами таблицы. <табличная часть> <СтрокаТабличнойЧасти Объект = "Зал" Место = "Место" КлючСтроки="1"/> <СтрокаТабличнойЧасти Объект = "Зал" Место = "Место2" КлючСтроки="2"/> <СтрокаТабличнойЧасти Объект = "Зал" Место = "Место3" КлючСтроки="3"/> </табличная часть> Все уже перерыл как мог. Первую строку читаю и записываю. дальше никак. нигде не смог найти как можно пройти по всем строкам и занести ее в табличную часть дока. Заранее спасибо. |
|||
1
youalex
03.07.17
✎
23:26
|
>Первую строку читаю и записываю. дальше никак
Код покажи |
|||
2
Имитация работы
03.07.17
✎
23:29
|
(1) Во ты гонишь. Тебе ж сказали - дальше никак. Это ты сейчас код писать должен, а не ТС.
|
|||
3
Rassvetniy
04.07.17
✎
04:16
|
<табличная часть> некорректный тег, пробелы в именах элементов не допускаются, уберите пробел и все прочитаете
|
|||
4
Rassvetniy
04.07.17
✎
04:20
|
запись = новый чтениеXML;
запись.ОткрытьФайл(путьДоФайлов()+"\tch2.xml"); пока запись.Прочитать() цикл Если запись.ТипУзла = ТипУзлаXML.НачалоЭлемента тогда если запись.Имя = "табличнаячасть" тогда иначе если запись.Имя = "СтрокаТабличнойЧасти" тогда код1 = запись.ПолучитьАтрибут("Объект"); код2 = запись.ПолучитьАтрибут("Место"); код3 = запись.ПолучитьАтрибут("КлючСтроки"); запись.Прочитать(); сообщить(код1); сообщить(код2); сообщить(код3); конецЕсли; конецЕсли; конецЕсли; конецЦикла; |
|||
5
asder117
04.07.17
✎
06:54
|
(3) знаю просто написал. спасибо за замечание
а за (4) спасибо. я про эту строку " запись.Прочитать();" не знал куда вотнуть...а код (1) Процедура ЗагрузитьРеквизитыИТабличныеЧасти( ИмяФайлаXML=Неопределено) Экспорт объект = Документы.бит_РегистрацияДоговоровАренды.СоздатьДокумент(); //объект.Дата = ТекущаяДата(); Если Не ИмяФайлаXML = Неопределено Тогда ФайлXML = Новый ЧтениеXML; ФайлXML.ОткрытьФайл("D:\test.XML"); Пока ФайлXML.Прочитать() Цикл Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, ФайлXML.Имя); КонецЕсли КонецЦикла; КонецЕсли; объект.Записать(); КонецПроцедуры Процедура ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, знач ИмяУзла) ИмяТипа = ""; ПространствоИмен = ""; Пока ФайлXML.ПрочитатьАтрибут() Цикл Если ФайлXML.Имя = "ИмяТипа" Тогда ИмяТипа = ФайлXML.Значение; ИначеЕсли ФайлXML.Имя = "URI" Тогда ПространствоИмен = ФайлXML.Значение; КонецЕсли; КонецЦикла; Пока ФайлXML.Прочитать() Цикл Если ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ФайлXML.Имя = ИмяУзла Тогда Возврат; ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.Текст Тогда ТипОбъекта = ИзXMLТипа(ИмяТипа, ПространствоИмен); Если НЕ ТипОбъекта = Неопределено тогда Объект = XMLЗначение(ТипОбъекта, ФайлXML.Значение); КонецЕсли; ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ИмяТекУзла = ФайлXML.Имя; /////запишем помещения Если ФайлXML.Имя = "ТабличнаяЧастьПомещений" Тогда //// ФайлXML.Прочитать(); // Если ФайлXML.Имя = "СтрокаПомещений" тогда // ФайлXML.Прочитать(); //для сч = 0 по ФайлXML.КоличествоАтрибутов()-1 цикл Пока ФайлXML.ПрочитатьАтрибут() Цикл //СтрокаОбъекта = Объект.Помещения.Добавить(); //СтрокаОбъекта[ФайлXML.Имя]=ФайлXML.Значение; Если ФайлXML.Имя = "КлючСтроки" тогда СтрокаОбъекта = Объект.Помещения.Добавить(); СтрокаОбъекта.КлючСтроки=Число(ФайлXML.Значение); ИначеЕсли ФайлXML.Имя = "Объект" тогда СтрокаОбъекта.Объект=Справочники.бит_ОбъектыНедвижимости.НайтиПоНаименованию("Зал А"); иначе СтрокаОбъекта.Помещение=Справочники.бит_Помещения.НайтиПоНаименованию("А-" + получитьЧисло(ФайлXML.Значение) ); КонецЕсли; //КонецЦикла; КонецЦикла; //КонецЕсли; //// ИначеЕсли ФайлXML.Имя = "ТабличнаяЧастьПлощадей" Тогда ФайлXML.Прочитать(); Если ФайлXML.Имя = "СтрокаПлощадей" тогда //ФайлXML.Прочитать(); Пока ФайлXML.ПрочитатьАтрибут() Цикл //СтрокаОбъекта = Объект.Помещения.Добавить(); //ФайлXML.ЗаписатьАтрибут("КлючСтроки", Строка(СтрокаТЧ.КлючСтроки)); //ФайлXML.ЗаписатьАтрибут("ВидПлощади", СтрокаТЧ.ВидПлощади.Наименование); //ФайлXML.ЗаписатьАтрибут("Площадь", Строка(СтрокаТЧ.Площадь)); //ФайлXML.ЗаписатьАтрибут("Ставка", Строка(СтрокаТЧ.Ставка)); //ФайлXML.ЗаписатьАтрибут("СтавкаСНДС", Строка(СтрокаТЧ.СтавкаСНДС)); //СтрокаОбъекта[ФайлXML.Имя]=ФайлXML.Значение; Если ФайлXML.Имя = "КлючСтроки" тогда СтрокаОбъекта = Объект.Площади.Добавить(); СтрокаОбъекта.КлючСтроки=Число(ФайлXML.Значение); ИначеЕсли ФайлXML.Имя = "ВидПлощади" тогда СтрокаОбъекта.ВидПлощади=Справочники.бит_ВидыПлощадей.НайтиПоНаименованию(ФайлXML.Значение); ИначеЕсли ФайлXML.Имя = "Площадь" тогда СтрокаОбъекта.Площадь=Число(ФайлXML.Значение); ИначеЕсли ФайлXML.Имя = "Ставка" тогда СтрокаОбъекта.Ставка=Число(ФайлXML.Значение); иначе СтрокаОбъекта.СтавкаСНДС=Число(ФайлXML.Значение); КонецЕсли; //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина; КонецЦикла; СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина; КонецЕсли; //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина; ИначеЕсли ФайлXML.Имя = "ДатаДоговора" Тогда Пока ФайлXML.ПрочитатьАтрибут() Цикл Объект.Дата=Дата(ФайлXML.Значение); КонецЦикла; ///конец записи площадей //КонецЕсли; Иначе Если ФайлXML.ПрочитатьАтрибут() Тогда ЗагрузитьОбъектРекурсивно(ФайлXML, Объект[ФайлXML.Значение], ИмяТекУзла); КонецЕсли; КонецЕсли; КонецЕсли; ////загрузим табчасть //Если ФайлXML.Имя = "ТабличнаяЧастьПомещений" тогда // Пока ФайлXML.ПрочитатьАтрибут() Цикл // СтрокаОбъекта = Объект.Помещения.Добавить(); // КонецЦикла; //КонецЕсли; //Внутри элемента считываем атрибуты //КонецЦикла; КонецЦикла; КонецПроцедуры функция получитьЧисло(Помещение) RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.IgnoreCase = Истина; //Игнорировать регистр RegExp.Global = Истина; //Поиск всех вхождений шаблона RegExp.MultiLine = Истина; //Многострочный режим RegExp.Pattern = "[^0-9]"; // отбор только чисел стр=RegExp.Replace(Помещение, ""); //Сообщить(стр); //Если стр = "309" тогда // аккк=0 ; // конецесли; возврат стр; //НужнаяСтрока = СокрЛП(Сред(Помещение, 16, 3)); //Сообщить(НужнаяСтрока); //возврат НужнаяСтрока; КонецФункции а хмл часть <ТабличнаяЧастьПомещений> <СтрокаПомещений КлючСтроки="1" Объект="Гастрономия (29-46)" Помещение="Место 29"/> <СтрокаПомещений КлючСтроки="2" Объект="Гастрономия (29-46)" Помещение="Место 30"/> <СтрокаПомещений КлючСтроки="3" Объект="Гастрономия (10 мест)" Помещение="Место 79"/> <СтрокаПомещений КлючСтроки="4" Объект="Гастрономия (10 мест)" Помещение="Место 80"/> <СтрокаПомещений КлючСтроки="5" Объект="Гастрономия (10 мест)" Помещение="Место 81"/> </ТабличнаяЧастьПомещений> <ТабличнаяЧастьПлощадей> <СтрокаПлощадей КлючСтроки="1" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="22 033,9" СтавкаСНДС="26 000"/> <СтрокаПлощадей КлючСтроки="2" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="11 016,95" СтавкаСНДС="13 000"/> <СтрокаПлощадей КлючСтроки="3" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="20 338,98" СтавкаСНДС="24 000"/> <СтрокаПлощадей КлючСтроки="4" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="10 169,49" СтавкаСНДС="12 000"/> <СтрокаПлощадей КлючСтроки="5" ВидПлощади="Фактическая площадь" Площадь="1" Ставка="10 169,49" СтавкаСНДС="12 000"/> </ТабличнаяЧастьПлощадей> |
|||
6
asder117
04.07.17
✎
12:37
|
Уважаемые интересует обход в цикле
<ТабличнаяЧастьПомещений> <СтрокаПомещений КлючСтроки="1" Объект="Гастрономия (29-46)" Помещение="Место 29"/> <СтрокаПомещений КлючСтроки="2" Объект="Гастрономия (29-46)" Помещение="Место 30"/> <СтрокаПомещений КлючСтроки="3" Объект="Гастрономия (10 мест)" Помещение="Место 79"/> <СтрокаПомещений КлючСтроки="4" Объект="Гастрономия (10 мест)" Помещение="Место 80"/> <СтрокаПомещений КлючСтроки="5" Объект="Гастрономия (10 мест)" Помещение="Место 81"/> </ТабличнаяЧастьПомещений> Всех строк |
|||
7
youalex
04.07.17
✎
13:13
|
если файлы не огромные, можно DOM использовать.
вгружаешь и обходишь:
|
|||
8
asder117
04.07.17
✎
13:46
|
(7) Пока не обромный т.к. тестирую на одном документе. Если буду выгружать все то будет большой файлик и количество строк. 1 бы мог выгрузить простым обменом, но 2 поля в табличной части надо будет заменять на другие. отлавливать их по имени или атрибутам сложновато
|
|||
9
asder117
04.07.17
✎
13:49
|
(7) а простыми средствами обойти как можно? в (5) коде я гружу сначала реквизиты (это вообще без проблем) потом ухожду на табличные части и ту ступор. Если делать дом то мне придется периписывать заливку всех реквизитов по-новому, а т.к. времени мало хочется реализовать по-легче
|
|||
10
asder117
04.07.17
✎
19:38
|
ну если других вариантов нет..буду пробовать (7)
|
|||
11
PiotrLoginov
04.07.17
✎
19:47
|
(10) Уже довольно давно читаю через XDTO. Справляется с любыми размерами
|
|||
12
asder117
04.07.17
✎
21:41
|
(11) Но под него как я понял надо писать еще и схему
|
|||
13
asder117
04.07.17
✎
22:05
|
(7) попробовал так
Если ФайлXML.Имя = "ТабличнаяЧастьПомещений" Тогда //// /////Проба работы через ДОМ ПостроительДОМ = Новый ПостроительDOM; документДОМ = ПостроительДОМ.Прочитать(ФайлXML); Узлы1 = документДОМ.ПолучитьЭлементыПоИмени("СтрокаПомещений"); для каждого узел из Узлы1 цикл СтрокаОбъекта = Объект.Помещения.Добавить(); СтрокаОбъекта.КлючСтроки=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("КлючСтроки").ЗначениеУзла); СтрокаОбъекта.Объект=Справочники.бит_ОбъектыНедвижимости.НайтиПоНаименованию("Зал А"); СтрокаОбъекта.Помещение=Справочники.бит_Помещения.НайтиПоНаименованию("А-" + получитьЧисло(узел.Атрибуты.ПолучитьИменованныйЭлемент("Помещение").ЗначениеУзла) ); //а=0; КонецЦикла; /////запишем помещения ИначеЕсли ФайлXML.Имя = "ТабличнаяЧастьПлощадей" Тогда Узлы2 = документДОМ.ПолучитьЭлементыПоИмени("СтрокаПлощадей"); для каждого узел из Узлы2 цикл СтрокаОбъекта1 = Объект.Площади.Добавить(); СтрокаОбъекта1.КлючСтроки=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("КлючСтроки").ЗначениеУзла); СтрокаОбъекта.ВидПлощади=Справочники.бит_ВидыПлощадей.НайтиПоНаименованию(узел.Атрибуты.ПолучитьИменованныйЭлемент("ВидПлощади").ЗначениеУзла); СтрокаОбъекта.Площадь=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("Площадь").ЗначениеУзла); СтрокаОбъекта.Ставка=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("Ставка").ЗначениеУзла); СтрокаОбъекта.СтавкаСНДС=Число(узел.Атрибуты.ПолучитьИменованныйЭлемент("СтавкаСНДС").ЗначениеУзла); СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина; //СтрокаОбъекта1.Объект=Справочники.бит_ОбъектыНедвижимости.НайтиПоНаименованию("Зал А"); //СтрокаОбъекта1.Помещение=Справочники.бит_Помещения.НайтиПоНаименованию("А-" + получитьЧисло(узел.Атрибуты.ПолучитьИменованныйЭлемент("Помещение").ЗначениеУзла) ); //а=0; //КонецЦикла; КонецЦикла; //ИначеЕсли ФайлXML.Имя = "ТабличнаяЧастьПлощадей" Тогда // ФайлXML.Прочитать(); // Если ФайлXML.Имя = "СтрокаПлощадей" тогда // //ФайлXML.Прочитать(); // Пока ФайлXML.ПрочитатьАтрибут() Цикл // //СтрокаОбъекта = Объект.Помещения.Добавить(); // //ФайлXML.ЗаписатьАтрибут("КлючСтроки", Строка(СтрокаТЧ.КлючСтроки)); // //ФайлXML.ЗаписатьАтрибут("ВидПлощади", СтрокаТЧ.ВидПлощади.Наименование); // //ФайлXML.ЗаписатьАтрибут("Площадь", Строка(СтрокаТЧ.Площадь)); // //ФайлXML.ЗаписатьАтрибут("Ставка", Строка(СтрокаТЧ.Ставка)); // //ФайлXML.ЗаписатьАтрибут("СтавкаСНДС", Строка(СтрокаТЧ.СтавкаСНДС)); // //СтрокаОбъекта[ФайлXML.Имя]=ФайлXML.Значение; // Если ФайлXML.Имя = "КлючСтроки" тогда // СтрокаОбъекта = Объект.Площади.Добавить(); // СтрокаОбъекта.КлючСтроки=Число(ФайлXML.Значение); // ИначеЕсли ФайлXML.Имя = "ВидПлощади" тогда // СтрокаОбъекта.ВидПлощади=Справочники.бит_ВидыПлощадей.НайтиПоНаименованию(ФайлXML.Значение); // ИначеЕсли ФайлXML.Имя = "Площадь" тогда // СтрокаОбъекта.Площадь=Число(ФайлXML.Значение); // ИначеЕсли ФайлXML.Имя = "Ставка" тогда // СтрокаОбъекта.Ставка=Число(ФайлXML.Значение); // иначе // СтрокаОбъекта.СтавкаСНДС=Число(ФайлXML.Значение); // КонецЕсли; // //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина; // КонецЦикла; // СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина; // КонецЕсли; //СтрокаОбъекта.РасчетПоСтавкеСНДС = Истина; ИначеЕсли ФайлXML.Имя = "ДатаДоговора" Тогда Пока ФайлXML.ПрочитатьАтрибут() Цикл Объект.Дата=Дата(ФайлXML.Значение); КонецЦикла; ///конец записи площадей //КонецЕсли; Иначе Если ФайлXML.ПрочитатьАтрибут() Тогда ЗагрузитьОбъектРекурсивно(ФайлXML, Объект[ФайлXML.Значение], ИмяТекУзла); КонецЕсли; КонецЕсли; КонецЕсли; Одну табличную часть читает вторую нет. в чем проблема понять не могу |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |