Имя: Пароль:
1C
1C 7.7
v7: Чтение атрибута XML подскажите где ошибка
0 Gavrinev
 
14.10.11
11:19
Нашел код для чтения атрибута xml, но он неработает, а сам с xml никогда дела не имел, может кто подскажет, где ошибка, или откуда копать...
[code]
Процедура ПриОткрытии()
   Перем ТК;
   Перем ДОМ,Узел,ТекЭлем;
   ТК=ФС.ТекКаталог();
   Попытка
       ДОМ=СоздатьОбъект("MSXML.DOMDocument");
       Узел=ДОМ.CreateProcessingInstruction("xml","version=""1.0"" encoding=""windows-1251""");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат;
   КонецПопытки;
       ДОМ.open(Строка(ТК)+Строка("\Opisan\OP.xml"));
       ОПП=ТекЭлем.GetAttribute("Элемент" + СокрЛП(Код));
КонецПроцедуры
[/code]
1 skunk
 
14.10.11
11:20
и где тут чтение аттрибута?
2 Ёпрст
 
14.10.11
11:21
(0) олё и как ты GetAttribute собрался брать у пустой переменной ТекЭлем ???
3 mishaPH
 
14.10.11
11:22
(0) заюзай v7+ и не парь себе мозг
4 andrewks
 
14.10.11
11:24
(3) -100
5 andrewks
 
14.10.11
11:24
(2)+1
6 zladenuw
 
14.10.11
11:25
ДокXML = CreateObject(мТипXMLБибилиотеки);
   ДокXML.Load(мКаталогДанных + лПолноеИмяФайлаЗагрузки);
   
   Попытка
       group    = ДокXML.selectSingleNode("documents");
   Исключение
       Возврат;
   КонецПопытки;
   Попытка
       preorders    = group.selectSingleNode("preorders").childNodes();
   Исключение
       Возврат 0;
   КонецПопытки;
   Для р = 0 По preorders.Length() - 1 Цикл
       preorder    = preorders.Item(р);
----- получаем реквизит
ПолучитьРеквизит(preorder, "реквизит");
Функция ПолучитьРеквизит(section, пИмяРеквизита)
   
   Попытка
       лРезультат    = СокрЛП(section.SelectSingleNode(пИмяРеквизита).text);
       Если Нрег(лРезультат) = "true" Тогда
           лРезультат    = 1;
       ИначеЕсли Нрег(лРезультат) = "false" Тогда
           лРезультат    = 0;
       КонецЕсли;
   Исключение
       лРезультат    = ПолучитьПустоеЗначение();
   КонецПопытки;
   
   Возврат лРезультат;
   
КонецФункции    //ПолучитьРеквизит()
7 zladenuw
 
14.10.11
11:25
думаю разберешся
8 Gavrinev
 
14.10.11
11:25
я ж написал что xml незнаю, думал что строка
ОПП=ТекЭлем.GetAttribute("Элемент" + СокрЛП(Код));
это делает
9 zladenuw
 
14.10.11
11:26
ну для полного феншуя
Функция ПолучитьТипXMLБибилиотеки()
   
   мТипXMLБибилиотеки    = "";
   
   лСЗнТипыXML    = СоздатьОбъект("СписокЗначений");
   лСЗнТипыXML.ДобавитьЗначение("MSXML2.DOMDocument.4.0");
   лСЗнТипыXML.ДобавитьЗначение("MSXML2.DOMDocument");
       
   Для р = 1 По лСЗнТипыXML.РазмерСписка() Цикл
       лТипXMLБибилиотеки    = лСЗнТипыXML.ПолучитьЗначение(р);
       Попытка
           лТестовыйXML = CreateObject(лТипXMLБибилиотеки);
       Исключение
           Продолжить;
       КонецПопытки;
       мТипXMLБибилиотеки    = лТипXMLБибилиотеки;
       Прервать;
   КонецЦикла;
   
   Возврат мТипXMLБибилиотеки;
   
КонецФункции    //ПолучитьТипXMLБибилиотеки()
10 andrewks
 
14.10.11
11:26
(8) она и делает.
но ей как бы входные данные нужны
11 Gavrinev
 
14.10.11
11:26
(6) огромное спасибо, буду разбиратся...
12 Gavrinev
 
14.10.11
11:28
(10) а ошибка на
ДОМ.open(Строка(ТК)+Строка("\Opisan\OP.xml"));
т.е. перед опен еще чето надо указать?
13 zladenuw
 
14.10.11
11:29
не открыть а загрузить
14 Gavrinev
 
14.10.11
11:30
(13) ну да, спасибо...
15 zladenuw
 
14.10.11
11:30
16 zladenuw
 
14.10.11
11:32
тут методы и свойства объекта MXML который создаешь в 1с. можно и 1с, но я так не умею :)
17 andrewks
 
14.10.11
13:31
Функция ВывестиЭлем(ТекЭлем,Знач Смещ);
   
   Рез=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";
   
   Попытка
       ДОМ=СоздатьОбъект("MSXML.DOMDocument");
       Узел=ДОМ.CreateProcessingInstruction("xml","version=""1.0"" encoding=""windows-1251""");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   ДОМ.insertBefore(Узел,);
   
   
   ТекЭлем=ДОМ.appendChild(ДОМ.createElement("Файл"));
   Текст=ДОМ.createTextNode("Здесь содержимое Файл");
   ТекЭлем.appendChild(Текст);
   ТекЭлем.setAttribute("Атрибут_Файл_1","Здесь содержимое Атрибут_Файл_1");
   Комм=ДОМ.createComment("Далее следует содержимое файла");
   ТекЭлем.appendChild(Комм);
   
   ТекЭлем=ТекЭлем.appendChild(ДОМ.createElement("СодержимоеФайла"));
   Текст=ДОМ.createTextNode("Здесь содержимое СодержимоеФайла");
   ТекЭлем.appendChild(Текст);
   ТекЭлем.setAttribute("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
   Текст=ДОМ.createCDATASection("Это секция CDATA");
   ТекЭлем.appendChild(Текст);
   ДОМ.save(ИмяФайла);
   
   Попытка
       ДОМ=СоздатьОбъект("MSXML.DOMDocument");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   
   ДОМ.async=0;
   ДОМ.validateOnParse=-1;
   ДОМ.resolveExternals=-1;
   ДОМ.load(ИмяФайла);
   
   Если (ДОМ.parseError.errorCode<>0) Тогда
       // ошибки при проверке валидности

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

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