|   |   | 
| 
 | Чтение xml. | ☑ | ||
|---|---|---|---|---|
| 0
    
        Блондинистая Ромашка 10.03.10✎ 09:05 | 
        Понимаю, тема заезженная.
  но я нашла либо последовательно считываемый документ, либо теги с текстом. А вот такой файлик как разобрать? <Zagolovok> - <Document Vid="InMaterials" sost="move" date="2010-01-29" number="00000002" contr="00000039" dogovor="000001" comment="1/3 "БД для ЭОКС"" sklad="00001" VidPost="post" InDokNumber="403" InDokDate="2010-01-29"> <Stroka nomenklatura="000000042" kolvo="1" price="3496" sum="3496" nds="533.29" /> <Stroka nomenklatura="1111111" kolvo="2" price="1111" sum="1111" nds="11.11" /> </Document> - <Document Vid="InMaterials" sost="move" date="2010-01-31" number="00000003" contr="00000712" dogovor="000001" comment="1/4" sklad="00001" VidPost="post" InDokNumber="52" InDokDate="2010-01-31"> <Stroka nomenklatura="000000024" kolvo="154.46" price="19.89" sum="3072.96" nds="468.76" /> </Document> </Zagolovok> Тут и теги и атрибуты. В Книге знаний есть статейка, но там разбирается как текстовый файл. Выдает мне ошибку неожиданный тег <Zagolovok><Document> в строке 3 Сообщить("Неожиданный тег "+xml_ИмяТега+" в строке "+xml_file.line); a=10/0; Деление на 0. Если XMLParser пользоваться, то вот так я верхнюю строку с общими параметрами дока могу забрать ТипТега = Документ.Спуститься(); ТипТега = Документ.Спуститься(); СвойстваТекущегоУзла = Документ.СвойстваТекущегоУзла; ИмяТега = СвойстваТекущегоУзла.Имя; Если ИмяТега = "Document" Тогда Сообщить(ИмяТега); ТипТега = Документ.Спуститься(); Пока ТипТега < 3 Цикл Для СчАтрибутов = 0 По СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл ИмяАтрибута = СвойстваТекущегоУзла.НаименованиеАтрибута(СчАтрибутов); Если ИмяАтрибута = "Vid" Тогда ВидДока = СвойстваТекущегоУзла.ЗначениеАтрибута(СчАтрибутов); ИначеЕсли ИмяАтрибута = "sost" Тогда СостояниеДока = СвойстваТекущегоУзла.ЗначениеАтрибута(СчАтрибутов); ИначеЕсли ИмяАтрибута = "date" Тогда ДатаДока = СвойстваТекущегоУзла.ЗначениеАтрибута(СчАтрибутов); ИначеЕсли ИмяАтрибута = "number" Тогда НомерДока = СвойстваТекущегоУзла.ЗначениеАтрибута(СчАтрибутов); ИначеЕсли ИмяАтрибута = "contr" Тогда КодКонтрагента = СвойстваТекущегоУзла.ЗначениеАтрибута(СчАтрибутов); ИначеЕсли ИмяАтрибута = "dogovor" Тогда КодДоговора = СвойстваТекущегоУзла.ЗначениеАтрибута(СчАтрибутов); ИначеЕсли ИмяАтрибута = "comment" Тогда Коммент = СвойстваТекущегоУзла.ЗначениеАтрибута(СчАтрибутов); КонецЕсли; КонецЦикла; Сообщить(ВидДока+" "+ДатаДока+" "+НомерДока+" "+КодКонтрагента+" "+КодДоговора+" "+Коммент); ТипТега = Документ.Спуститься(); СвойстваТекущегоУзла = Документ.СвойстваТекущегоУзла; ИмяТега = СвойстваТекущегоУзла.Имя; Сообщить(ИмяТега); Ну а на подчиненный тег stroka уже не получается спуститься :( Может через узлы? А как тогда быть с атрибутами? | |||
| 1
    
        Ёпрст гуру 10.03.10✎ 09:08 | ||||
| 2
    
        Блондинистая Ромашка 10.03.10✎ 09:09 | 
        (1) читала, не нравится  почему я должна разбирать xml как тектовый, если есть специальные средства? | |||
| 3
    
        Ёпрст гуру 10.03.10✎ 09:11 | 
        (2) потому,что так быстрее     | |||
| 4
    
        Ёпрст гуру 10.03.10✎ 09:12 | 
        +3 да и xml - всю жизнь был обычным текстовым файлом..     | |||
| 5
    
        Блондинистая Ромашка 10.03.10✎ 09:13 | 
        (3) тогда ищем косяк в коде  xml_ОткрытьФайл(стрИмяФайла); xml_Прочитать("<Zagolovok>"); Пока xml_Прочитать("<Document")=1 Цикл сч=сч+1; //Для ускорения Если сч%1000=0 Тогда //Для ускорения ЗафиксироватьТранзакцию(); //Для ускорения НачатьТранзакцию();//Для ускорения КонецЕсли;//Для ускорения Если xml_ИмяТега="</Document>" Тогда Прервать; КонецЕсли; ВидДока=xml_ПолучитьАтрибут("Vid"); СостояниеДока=xml_ПолучитьАтрибут("sost"); ДатаДока=xml_ПолучитьАтрибут("date"); НомерДока=xml_ПолучитьАтрибут("number"); КодКонтрагента=Число(xml_ПолучитьАтрибут("contr")); КодДоговора=Число(xml_ПолучитьАтрибут("dogovor")); Коммент=xml_ПолучитьАтрибут("comment"); КодСклада=Число(xml_ПолучитьАтрибут("sklad")); ВидПоступления=Число(xml_ПолучитьАтрибут("VidPost")); НомерДокВход=xml_ПолучитьАтрибут("InDokNumber"); ДатаДокВход=xml_ПолучитьАтрибут("InDokDate"); Сообщить(ВидДока + " " + СостояниеДока + " " + ДатаДока + " " + НомерДока); Пока xml_Прочитать("<Stroka")=1 Цикл Если xml_ИмяТега="/>" Тогда Прервать; КонецЕсли; КодНоменклатуры=xml_ПолучитьАтрибут("nomenklatura"); Колво=xml_ПолучитьАтрибут("kolvo"); Цена=xml_ПолучитьАтрибут("price"); Сумма=xml_ПолучитьАтрибут("sum"); НДС=xml_ПолучитьАтрибут("nds"); Сообщить(КодНоменклатуры+" "+Колво+" "+Цена+" "+Сумма+" "+НДС); КонецЦикла; КонецЦикла; //по элементам XML xml_Закрыть(); Ошибку выдает следующую: Неожиданный тег <Zagolovok><Document> в строке 3 Сообщить("Неожиданный тег "+xml_ИмяТега+" в строке "+xml_file.line); a=10/0; Деление на 0. | |||
| 6
    
        Just4Fun 10.03.10✎ 09:18 | 
        ХМЛДок = СоздатьОбъект("MSXML2.DOMDocument");  Корень = ХМЛДок.documentElement; //позиционируемся на корневой элемент документа ДочерниеУзлы = Корень.childNodes; //узлы Док, т.е. отдельные документы СписокЭлементовСправочники = ХМЛДок.getElementsByTagName("Справочники"); СписокЭлементовСпецификации = ХМЛДок.getElementsByTagName("Спецификации"); Для к = 0 по ХМЛСпецификации.length - 1 Цикл ХМЛСпецификация = ХМЛСпецификации.item(к); .................... ДокСпецификация.ДатаДок = ХМЛСпецификация.attributes.getNamedItem("Дата").value; ДокСпецификация.НомерДокОУ = СокрЛП(ХМЛСпецификация.attributes.getNamedItem("НомерДок").value); ДокСпецификация.Номер = ХМЛСпецификация.attributes.getNamedItem("НомерСпецификации").value; Для к2 = 0 По ХМЛСпецификация.childNodes.length - 1 Цикл ХМЛЭлемент = ХМЛСпецификация.childNodes.item(к2); Если ХМЛЭлемент.nodeName = "Шапка" Тогда РеквизитыШапки = ХМЛЭлемент.childNodes; Для к3 = 0 По РеквизитыШапки.length - 1 Цикл ............................... КонецЦикла; КонецЕсли; КонецЦикла; | |||
| 7
    
        Just4Fun 10.03.10✎ 09:21 | 
        +(6) Пользуюсь такой конструкцией.  getElementsByTagName - получить узел по имени attributes.getNamedItem("Дата").value - значение атрибута | |||
| 8
    
        Ёпрст гуру 10.03.10✎ 09:22 | 
        (5) смотри что тут в отладчике  >>>Если Найти(прм_ОжидаемыеТеги,xml_ИмяТега)=0 Тогда чему равно прм_ОжидаемыеТеги и xml_ИмяТега | |||
| 9
    
        1Сергей 10.03.10✎ 09:24 | 
        У меня в карточке есть ссылка на инфостарт. Там есть сравниловка двух хмл-ок, посмотри в качестве примера     | |||
| 10
    
        ko_elena 10.03.10✎ 09:29 | 
        Добрый день!
  Очень интересует эта тема. Так как надо будет разбирать дакомент такой же структуры. | |||
| 11
    
        Гость2 10.03.10✎ 09:30 | 
        Процедура ЗагрузитьФайл(ТЗЗагрДок, ИмяФайла) 
  ДокXML = гXMLАнализатор.СоздатьДокумент(); ДокXML.Загрузить(ИмяФайла); Выборка = ДокXML.ЭлементДокумента.ПолучитьПодчиненныйПоНомеру(1); Выборка = Выборка.ВыбратьУзлы("Документ"); СзУзлов = СоздатьОбъект("СписокЗначений"); Для Сч = 0 По Выборка.КоличествоУзлов - 1 Цикл Элемент = Выборка.ПолучитьУзел(Сч); Вид = Элемент.ПолучитьАтрибут ("Вид"); НомерДок = Элемент.ПолучитьАтрибут ("НомерДок"); Стр = ""; Если ТЗЗагрДок.НайтиЗначение(НомерДок, Стр, "НомерДок") = 0 Тогда Продолжить; КонецЕсли; СзУзлов.УдалитьВсе(); СчЦ = 0; Для СчЦ = 1 По Элемент.КоличествоПодчиненных() Цикл СзУзлов.Установить(Элемент.ПолучитьПодчиненныйПоНомеру(СчЦ).Наименование, Элемент.ПолучитьПодчиненныйПоНомеру(СчЦ)); КонецЦикла; Если Вид = "Счет" Тогда ЗагрузитьСчет(СзУзлов); КонецЕсли; КонецЦикла; КонецПроцедуры // ЗагрузитьФайл() | |||
| 12
    
        Гость2 10.03.10✎ 09:32 | 
        +(11) Файл такого вида.
  <?xml version="1.0" encoding="windows-1251" standalone="no" ?> - <ФайлОбмена ВерсияФормата="1.0" ИдКонфигурацииПриемника="Управление платежами 7.70.1.01" ДатаНачала="2009-10-01" ДатаОкончания="2009-11-15"> - <Документы> - <Документ Вид="Счет" НомерДок="0010000001" ДатаДок="2009-10-16" Подразделение="001" Контрагент="400000020011" НПП="1"> <НомерДок>0010000001</НомерДок> <ДатаДок>2009-10-16</ДатаДок> | |||
| 13
    
        ko_elena 10.03.10✎ 09:38 | 
        Спасибо! сейчас будем пробывать!     | |||
| 14
    
        1Сергей 10.03.10✎ 09:40 | 
        (13) Семён Семёныч?     | |||
| 15
    
        Блондинистая Ромашка 10.03.10✎ 10:22 | 
        (11)  Почему-то у меня сообщает 0 узлов :( ну и дальше в цикл естественно не заходит :( ДокXML = гXMLАнализатор.СоздатьДокумент(); ДокXML.Загрузить("c:\1c files\ВыгрузкаДоков.xml"); Выборка = ДокXML.ЭлементДокумента.ПолучитьПодчиненныйПоНомеру(1); Выборка = Выборка.ВыбратьУзлы("Document"); СзУзлов = СоздатьОбъект("СписокЗначений"); Сообщить(Выборка.КоличествоУзлов); в чем ошибка? (мой файл xml выше, в первом посте) | |||
| 16
    
        Блондинистая Ромашка 10.03.10✎ 10:36 | 
        Ура! Наконец-то доперло)))  Для i=1 По ДокXML.ЭлементДокумента.КоличествоПодчиненных() Цикл ТекУзел = ДокXML.ЭлементДокумента.ПолучитьПодчиненныйПоНомеру(i); Вид = ТекУзел.ПолучитьАтрибут ("Vid"); НомерДок = ТекУзел.ПолучитьАтрибут ("number"); Сообщить(Вид+" "+НомерДок); //Сообщить(ТекУзел.КоличествоПодчиненных()); Для j=1 По ТекУзел.КоличествоПодчиненных() Цикл ТекПодчиненныйУзел = ТекУзел.ПолучитьПодчиненныйПоНомеру(j); КодНоменклатуры = ТекПодчиненныйУзел.ПолучитьАтрибут ("nomenklatura"); Сообщить(КодНоменклатуры); КонецЦикла; Сообщить("---"); КонецЦикла; | |||
| 17
    
        ko_elena 10.03.10✎ 15:36 | 
        Процедура Сформировать()
  Анализатор = СоздатьОбъект("AddIn.XMLParser"); гДокДанных = Анализатор.СоздатьПоследовательноСчитываемыйДокумент(); гДокДанных.СвязатьСФайлом(КаталогИБ()+"xml выгрузка\zayavka.xml"); ТипТега = гДокДанных.Спуститься(); //корень ТипТега = гДокДанных.Спуститься(); // первый документ пока ТипТега=1 цикл //считываем шапку документа Сообщить("шапка"); Эл = гДокДанных.СвойстваТекущегоУзла; КолАтр = Эл.КоличествоАтрибутов; Для й=1 по КолАтр Цикл Сообщить(Эл.ЗначениеАтрибута(й-1)); КонецЦикла; ТипТега = гДокДанных.Спуститься(); Пока ТипТега <> 3 Цикл //считываем строки документа Эл = гДокДанных.СвойстваТекущегоУзла; Сообщить("строка"); КолАтр = Эл.КоличествоАтрибутов; Для й=1 по КолАтр Цикл Сообщить(Эл.ЗначениеАтрибута(й-1)); КонецЦикла; ТипТега = гДокДанных.Следующий(); КонецЦикла; ТипТега = гДокДанных.Следующий(); КонецЦикла; КонецПроцедуры методом проб и ошибок у меня заработало ВОТ В ТАКОМ ВИДЕ. кто может прокомментировать? потому как логика методов Спуститься() и Следующий() не понятна!!! | |||
| 18
    
        ko_elena 10.03.10✎ 16:40 | 
        И еще один вопрос для спецов!
  На что влияет способ выборки СоздатьДокумент() и соответствующая обработка дальше или СоздатьПоследовательноСчитываемыйДокумент() и соответствующая обработка дальше только на методы дальнейшей обработки или на скорость? | |||
| 19
    
        Гость2 10.03.10✎ 20:01 | 
        (18) СоздатьПоследовательноСчитываемыйДокумент() - ты имеешь ЖЕСТСКУЮ структуру файла
  СоздатьДокумент() - количество циклов (строчек) заранее неизвестно. | |||
| 20
    
        Злопчинский 11.03.10✎ 04:14 | 
        (1) бяка..
  //Ограничения на входящие файлы XML: //1) В первой строке обязателен заголовок XML вида <?xml version="1.0" encoding="windows-1251"?> . //2) Каждый тег должен быть записан в отдельной строке. Возможны отступы от начала строки и пустые строки. //3) Значения атрибутов - строго в двойных кавычках. //4) Не поддерживаются текстовые значения (любые значения можно передавать только через атрибуты). //5) Комментарии и "подобные им" элементы XML не поддерживаются. . итого: 1. сплошь и рядом когда приходят файлы без заголовка, продавить на правильный формат - возможности нет 2. сплошь и рядом когда идет сплошняком 3. тут вроде все нормально обычно 4. по разному бывает... 5. по разному бывает. . итого, перед использованием (1) - его надо "нормализовать": проверить/вставить первую строку, распарсить теги на отдельные строки, проверить на соответсвие формату теги-атрибуты-значения-отсутствие комментов и ТОЛЬКО ПОТОМ применять (1). | |||
| 21
    
        Ёпрст гуру 11.03.10✎ 08:16 | 
        (20) зато быстро     | |||
| 22
    
        Гость2 11.03.10✎ 10:12 | 
        (16) А фотку?    :-)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |