Имя: Пароль:
1C
Админ
чтение значений тегов в XML-файлах
0 АзатСалим
 
02.04.12
18:20
Здесь, конечно не раз уже обсуждалось чтение XML-файлов. Но везде обсуждаются файлы, в которых данные "спрятаны" в атрибутах. А у меня данные между тегами. Никак не получается их достать...

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Z_DOGOVOR_TAT_AKTIV xmlns:ns0="urn:sap-com:document:sap:rfc:functions"><ZZDATE>2012-03-15</ZZDATE><ZDOG_AKTIV><item><DATE_DOG>20120315</DATE_DOG><SYS_NOMD>0000000000724</SYS_NOMD><NAZV_D>Договор взятия в аренду</NAZV_D><VN_NOM>19-2000</VN_NOM><DATE_BEGD>2012-01-01</DATE_BEGD><DATE_ENDD>2012-12-31</DATE_ENDD><KONTR>0000314819</KONTR></item><item><DATE_DOG>20120315</DATE_DOG><SYS_NOMD>0000000000725</SYS_NOMD><NAZV_D>ДС на ввод</NAZV_D><VN_NOM>00000000000000000123</VN_NOM><DATE_BEGD>2012-01-02</DATE_BEGD><DATE_ENDD>2012-12-31</DATE_ENDD><KONTR>0000314819</KONTR></item></ZDOG_AKTIV></ns0:Z_DOGOVOR_TAT_AKTIV>

Использую ПоследовательноСчитываемыйДокумент. Дерево читаю так:

Процедура ПрочитатьДерево(ВложТег=0,гФайл)
   Если ВложТег>0 Тогда
       Уровней=КвоУровнейХМЛ(ВложТег,гФайл);
       штрих="--";
       Если ВложТег<3 Тогда
           //первый полученный элемент
           Эл = гФайл.СвойстваТекущегоУзла;
           Сообщить(""+штрих+"<ИмяТега>="+гФайл.СвойстваТекущегоУзла.Имя+"  Уровень="+гФайл.СвойстваТекущегоУзла.Уровень);
       КонецЕсли;

       Если  ВложТег =3 Тогда
           //последующие вложенные элементы на текущем уровне
           ВложТег=гФайл.Следующий();
           Если ВложТег<3 Тогда
               штрих=штрих+"--";
               Сообщить(""+штрих+"<ИмяТега>="+гФайл.СвойстваТекущегоУзла.Имя+"  Уровень="+гФайл.СвойстваТекущегоУзла.Уровень);
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Имя тега прочитать могу, уровень тоже. А вот значение не знаю, как...
1 andrewks
 
02.04.12
18:32

Функция ВывестиЭлем(ТекЭлем,Знач Смещ);
   
   Рез=1;
   Попытка
       Если (ТекЭлем.nodeType=1) Тогда
           Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":","!");
       ИначеЕсли (ТекЭлем.nodeType=3) Тогда
           Сообщить(Смещ+"Текст элемента: "+ТекЭлем.nodeValue);
       ИначеЕсли (ТекЭлем.nodeType=4) Тогда
           Сообщить(Смещ+"CDATA: "+ТекЭлем.nodeValue);
       ИначеЕсли (ТекЭлем.nodeType=8) Тогда
           Сообщить(Смещ+"Комментарий: "+ТекЭлем.nodeValue,"I");
       Иначе
           Сообщить(Смещ+"Элемент "+ТекЭлем.nodeName+":");
           Сообщить(Смещ+"Тип: "+ТекЭлем.nodeType);
       КонецЕсли;
       
       Для ном=0 По ТекЭлем.attributes.length-1 Цикл
           ТекАтр=ТекЭлем.attributes(ном);
           Сообщить(Смещ+"Атрибут: "+ТекАтр.nodeName+", значение: "+ТекАтр.nodeValue);
       КонецЦикла;
       
   Исключение
       Рез=0;
   КонецПопытки;
   
   
   Смещ=Смещ+"    ";
   
   Для ном=0 По ТекЭлем.childNodes.length-1 Цикл
       ДочЭлем=ТекЭлем.childNodes(ном);
       Рез=Рез*ВывестиЭлем(ДочЭлем,Смещ);
   КонецЦикла;
   
   Возврат Рез;
КонецФункции

//*******************************************
Функция Сформировать()

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

       Сообщить("При проверке валидности файла "+ИмяФайла+" выявлены ошибки!","!");
       Возврат 0;
   КонецЕсли;

   Рут=ДОМ.documentElement();
   Смещ="";
   Рез=ВывестиЭлем(Рут,Смещ);
   
   Возврат Рез;
КонецФункции

2 АзатСалим
 
03.04.12
20:23
andrewks, спасибА, огромное!!!

а если XML-файл будет большим (несколько Мб), обработка проглотит его?
3 andrewks
 
03.04.12
20:41
(2) угу. большой - это больше ста мегов
4 АзатСалим
 
04.04.12
18:38
Еще раз, спасибо!
2 + 2 = 3.9999999999999999999999999999999...