Имя: Пароль:
1C
1C 7.7
v7: CDATA в XML (MSXML2.DOMDocument)
,
0 pavlo
 
21.08.12
08:51
Кто нить знает как запихнуть через MSXML2.DOMDocument поле типа CDATA?
Сейчас обычные теги создаются просто, код ниже, но cdata так не создается и не знаю как сделать :(

Процедура ЗаписьХМЛ()
   xml=СоздатьОбъект("MSXML2.DOMDocument");
   Классификатор = xml.createElement("Классификатор");
   Классификатор.text = "тут текстовое значение элемента"
   xml.appendChild(Классификатор);
КонецПроцедуры

а вот куда и как применить xml.createCDATASection() не понятно, потому как текст многострочный и с разными символами типа &, поэтому чтобы не менять каждый символ и оставить все форматирование хотел применить вот этот тип данных, но увы не получается.

Кто нить сталкивался, может помочь?
1 andrewks
 
21.08.12
08:59

   Попытка
       ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");
       Узел=ДОМ.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(ИмяФайла);

2 pavlo
 
21.08.12
09:36
спасибо, но в моем варианте орет, что недопустимые данные для узла типа CDATA :(
у меня что то типа:

Процедура ДобавитьЗначениеВПодГруппу(Тег,ИмяПодГруппы,зн="")
   //тег - в какую ветку добавляем подгруппу
   //ИмяПодГруппы - какое имя будет у подгруппы
   //зн - значение подгруппы
   Перем имя,данные;
   
   имя = xml.createElement(СокрЛП(ИмяПодГруппы));
   Если ПустоеЗначение(зн)=0 Тогда
       Если Лев(СокрЛП(зн),8)="<![CDATA" Тогда
           данные = xml.createCDATASection(зн);
       Иначе
           //имя.text = зн;
           данные = xml.createTextNode(зн);
       КонецЕсли;
   КонецЕсли;
   Тег.appendChild(данные);
КонецПроцедуры // ДобавитьЗначениеВПодГруппу
3 andrewks
 
21.08.12
09:38
(2) код в (1) абсолютно рабочий. изучай, сравнивай, осмысливай разницу
4 pavlo
 
21.08.12
09:39
да я его пример уже изучал, аналог тут http://www.script-coding.com/XMLDOMscripts.html, толку то что то не могу взять в толк :( что ей нужно и что не так.
5 pavlo
 
21.08.12
09:42
в моем примере связи не видно и это понятно, но не понятно как в итоге должен пазл сложится ;)
6 pavlo
 
21.08.12
09:45
ругается как то так:
данные = xml.createCDATASection(зн);
{C:\тест.ERT(70)}: msxml3.dll: Недопустимые данные для узла типа ''CDATA''.
7 pavlo
 
21.08.12
09:46
а в "зн" просто текст формата "<![CDATA[Пример разного рода текста]]>"
8 andrewks
 
21.08.12
09:52
да е-моё...

вот тебе _полный рабочий_ код
изучай, смотри


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

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

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

9 Новенький_2009
 
21.08.12
09:55
А кодировка содержимого то в CDATA какая?
10 pavlo
 
21.08.12
09:57
(8) ладно, буду дальше думать как победить, спс.
(9) xml.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""");
11 Новенький_2009
 
21.08.12
10:00
(10) а что должно быть?
12 pavlo
 
21.08.12
10:01
(11) оно и должно быть, суть вопроса не в кодировке ;)
13 Новенький_2009
 
21.08.12
10:07
(12) как вдоволь на#ебешься, апни тему - подскажу уж совсем открытым текстом :)
14 Надсмотрщик
 
21.08.12
10:10
(7) Попробуй передать

зн = "Пример разного рода текста";
15 pavlo
 
21.08.12
10:17
(14) Типы не совпадают - пишет.
16 Надсмотрщик
 
21.08.12
10:20
(15) Методом "проб и ошибок"

зн = "[Пример разного рода текста]"
зн = "CDATA[Пример разного рода текста]"
17 pavlo
 
21.08.12
10:29
нет, ну запихнуть в итоге получается, но не так как нужно.
нужно чтобы структура была:
<Классификаторы>          <!-- Справочник цветов товара -->
   <Классификатор>
       <Ид>тут код какой нить</Ид>
       <Имя> <![CDATA[Тут что угодно]]> </Имя>
   </Классификатор>
</Классификаторы>

как то так нужно.
18 Надсмотрщик
 
21.08.12
10:40
А как получается?
19 andrewks
 
21.08.12
10:49
ну вы, етить, измудряетесь, я не могу над вами. _готовый_ код не смочь воткнуть - это эпик фэйл
20 pavlo
 
21.08.12
10:54
Ну на выходе получилось теперь такое и вроде пашет, в связи с чем больше спасибо ;)

Процедура ДобавитьЗначениеВПодГруппу(Тег,ИмяПодГруппы,зн="",CDATA=0)
   //тег            - в какую ветку добавляем подгруппу
   //ИмяПодГруппы    - какое имя/ветка будет у подгруппы
   //зн            - значение подгруппы
   //CDATA        - тип данных 0=текст,1=произвольные данные
   Перем имя,данные;
   
   имя = xml.createElement(СокрЛП(ИмяПодГруппы));
//    имя.setAttribute("Атрибут_СодержимоеФайла_1","Здесь содержимое Атрибут_СодержимоеФайла_1");
   Если (CDATA=1) и (ПустоеЗначение(зн)=0) Тогда
       данные = xml.createCDATASection(зн);
   Иначе
       данные = xml.createTextNode(зн);    
   КонецЕсли;
   Тег.appendChild(Имя);
   Имя.appendChild(данные);
КонецПроцедуры // ДобавитьЗначениеВПодГруппу
21 pavlo
 
21.08.12
10:56
(19) уважаемый я рад за вас, что вы все понимаете и спасибо за пример, но если не хочется объяснять, зачем слюной исходить?
(18) спасибо, вроде идет, проверю еще на формат, правильный в смысле формата XML и можно радоваться будет.
22 Надсмотрщик
 
21.08.12
10:58
(21) Пиво на мыло сбросишь           :-)
23 pavlo
 
21.08.12
11:00
(22) ;) ушло
24 Надсмотрщик
 
21.08.12
11:01
(23) Жаль я сейчас "за рулем", но вечером за твое здоровье.    ;-)))
25 pavlo
 
21.08.12
11:02
(24) за ваше ;)
26 pavlo
 
21.08.12
11:27
(8) большое спасибо вам тоже за примеры и оперативность
27 andrewks
 
21.08.12
11:27
(21) 1. я слюной не исходил, и объяснять там нечего - код элементарный. а выразить своё мнение по поводу происходящего я имею полное право
28 andrewks
 
21.08.12
11:28
(26) пожалуйста :) обращайся
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан