Имя: Пароль:
1C
 
Как сформировать xml по схеме xsd?
0 Stim
 
20.01.16
10:37
Есть файлик xsd.
а нем есть узел
<xsd:element name="CryptoParameters" minOccurs="0">
с атрибутами типа
<xsd:element name="CryptoParameters" minOccurs="0">
                            <xsd:annotation>
                                <xsd:documentation>Настройки криптографии</xsd:documentation>
                            </xsd:annotation>
                            <xsd:complexType>
                                <xsd:sequence>
                                    <xsd:element name="CSPName">
                                        <xsd:annotation>
                                            <xsd:documentation>Имя CSP (cryptographic service provider)</xsd:documentation>
                                        </xsd:annotation>
                                        <xsd:simpleType>
                                            <xsd:restriction base="xsd:string">
                                                <xsd:maxLength value="256"/>
                                            </xsd:restriction>
                                        </xsd:simpleType>
                                    </xsd:element>

и др.


Пишу код по заполнению этих атрибутов:

ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить(ФайлXSD);
МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);

МойXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
МойXML.ОткрытьФайл(ФайлXML, ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();

структурныйТип = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "CryptoParameters");
ПрограммаXDTO = ФабрикаXDTO.Создать(структурныйТип);
ПрограммаXDTO.CSPName = программа.ИмяПрограммы;
ПрограммаXDTO.CSPType = программа.ТипПрограммы;
ПрограммаXDTO.SignAlgorithm = программа.АлгоритмПодписи;
ПрограммаXDTO.HashAlgorithm = программа.АлгоритмХеширования;
ПрограммаXDTO.EncryptAlgorithm = программа.АлгоритмШифрования;
ФабрикаXDTO.ЗаписатьXML(ФайлXML, ПрограммаXDTO);



Ругается на ПрограммаXDTO = ФабрикаXDTO.Создать(структурныйТип);


где ошибка?
1 Stim
 
20.01.16
11:05
апну ветку
2 denis_jj
 
20.01.16
11:09
Посмотрите отладчиком какой тип получается в переменной структурныйТип. Возможно не угадали с названием и там Неопределено.
3 Serginio1
 
20.01.16
11:18
структурныйТип = МояФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "CryptoParameters");
ПрограммаXDTO = МояФабрикаXDTO.Создать(структурныйТип);
4 Stim
 
20.01.16
11:21
(3) почему 2 запятых?
ФабрикаXDTO (XDTOFactory)
Тип (Type)
Вариант синтаксиса: По имени и URI пространства имен

Синтаксис:

Тип(<URIПространстваИмен>, <Имя>)
5 Stim
 
20.01.16
11:22
(2) неопределено, так и есть. хмм
6 denis_jj
 
20.01.16
11:23
(5) Разбирайтесь с созданием фабрики и её схемами. Возможно не подходит файл XSD, или где-то ошибка с параметрами создания фабрики.
7 denis_jj
 
20.01.16
11:24
(5) После создания попробуйте отладчиком посмотреть какие в ней пакеты есть.
8 Serginio1
 
20.01.16
12:29
(4) Это сайт добавляет
9 Serginio1
 
20.01.16
12:29
Смотри отладчиком типы и пространство имен
10 Serginio1
 
20.01.16
12:30
Если у тебя один файл то просто

МояФабрикаXDTO = СоздатьФабрикуXDTO(Путь_К_Файлу_XSD);
11 Stim
 
20.01.16
14:54
какая-то фигня.
Хочу сформировать пустой файл xml по схеме.

код:

ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить(ФайлXSD);
МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
структурныйТип = МояФабрикаXDTO.Тип("http://bank.1c.ru/XMLSchema";, "Settings");
Если структурныйТип <> Неопределено Тогда
МойXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
МойXML.ОткрытьФайл(ФайлXML, ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();
ПрограммаXDTO = МояФабрикаXDTO.Создать(структурныйТип);
ФабрикаXDTO.ЗаписатьXML(МойXML, ПрограммаXDTO);
КонецЕсли;

Ошибка:

{Форма.Форма.Форма(25)}: Ошибка при вызове метода контекста (ЗаписатьXML)
ФабрикаXDTO.ЗаписатьXML(МойXML, ПрограммаXDTO);
по причине:
Несоответствие типов XDTO:
Тип '{http://bank.1c.ru/XMLSchema}Settings' не найден
Тип принадлежит пакету, входящему в состав другой фабрики типов XDTO


что за хрень?
12 Stim
 
20.01.16
14:56
ФабрикаXDTO.ЗаписатьXML(МойXML, ПрограммаXDTO,"Settings","http://bank.1c.ru/XMLSchema";);

тоже самое
13 Serginio1
 
20.01.16
14:59
МояФабрикаXDTO.ЗаписатьXML(МойXML, ПрограммаXDTO);
14 Stim
 
20.01.16
15:01
(13) точно, спасибо!
15 Stim
 
20.01.16
15:01
А как добраться до CryptoParameters ?
16 Serginio1
 
20.01.16
15:20
Смотри пакеты где он у тебя описан
17 Stim
 
20.01.16
16:43
(16) скажи, друг, как создать значениеXDTO CryptoParameters (МояФабрикаXDTO.Создать() ) из
МояФабрикаXDTO.Пакеты[1].КорневыеСвойства[0].Тип.Свойства[6].Тип.Свойства[6]

структура примерно такая:
"http://bank.1c.ru/XMLSchema";
__Settings
____Data
______CryptoParameters
18 Serginio1
 
20.01.16
16:48
19 Serginio1
 
20.01.16
16:58
То есть тебе проще воспользоваться

Функция ПолучитьТипОбъекта(Фабрика,Тип) Экспорт

    

    МассивПути = СтрРазделить(Тип, \".\");

    

    ПервыйЭлемент = МассивПути[0];

    Если Лев(ПервыйЭлемент,1) = \"{\" И Прав(ПервыйЭлемент,1) = \"}\" Тогда

        ИмяПакета = Сред(ПервыйЭлемент, 2, СтрДлина(ПервыйЭлемент) - 2);

        Коллекция = Фабрика.Пакеты.Получить(ИмяПакета).КорневыеСвойства;

    Иначе

        ТипОбъекта = Фабрика.Тип(ВерсияСхемы, ПервыйЭлемент);

        Коллекция = ТипОбъекта.Свойства;

   КонецЕсли;

    

    МассивПути.Удалить(0);

    Пока МассивПути.Количество() > 0 Цикл

        

        Если Коллекция = Неопределено Тогда

            Возврат Неопределено;

        КонецЕсли;

        

        Свойство = Коллекция.Получить(МассивПути[0]);

        Если Свойство = Неопределено Тогда

            Возврат Неопределено;

        КонецЕсли;

        

        ТипОбъекта = Свойство.Тип;

        МассивПути.Удалить(0);

        Попытка

            Коллекция = ТипОбъекта.Свойства;

        Исключение

            Коллекция = Неопределено;

        КонецПопытки;

        

    КонецЦикла;

    

    Возврат ТипОбъекта;

    

КонецФункции




ПолучитьТипОбъекта(МояФабрика,"{http://bank.1c.ru/XMLSchema}.Settings.Data.CryptoParameters";)
20 Serginio1
 
20.01.16
17:01
21 Serginio1
 
20.01.16
17:05
Подправь
ПолучитьТипОбъекта(Фабрика,Тип,ВерсияСхемы="")
22 Stim
 
20.01.16
17:07
(19) ругается на всякие
(ПервыйЭлемент,1) = \"{\"
23 Serginio1
 
20.01.16
17:19
(22) Это сайт добавляет. Убери их
24 Stim
 
20.01.16
17:29
(23) спасибо!
все получилось. только через ПолучитьТипОбъекта(МояФабрикаXDTO,"{http://bank.1c.ru/XMLSchema}|Settings|Data|CryptoParameters";);
25 Stim
 
20.01.16
17:41
(23) подскажи еще пжл:

у меня структура получилась такая

__Settings
____Data
______CryptoParameters
________свойство1
________свойство2
________свойство3
__________подсвойство3_1


как это подсвойство записать?
26 Serginio1
 
20.01.16
17:43
Аналогично
ПолучитьТипОбъекта(МояФабрикаXDTO,"{http://bank.1c.ru/XMLSchema}.Settings.Data.CryptoParameters.свойство3.подсвойство3_1
");
27 Stim
 
20.01.16
17:48
(26) да. так и пишу
структурныйТипEncrypted = ПолучитьТипОбъекта(МояФабрикаXDTO,"{http://bank.1c.ru/XMLSchema}|Settings|Data|CryptoParameters|Encrypted";);
ЗначениеXDTOEncrypted = МояФабрикаXDTO.Создать(структурныйТипEncrypted);
ЗначениеXDTOEncrypted.EncryptAlgorithm =  программа.АлгоритмШифрования;

МояФабрикаXDTO.ЗаписатьXML(МойXML, ПрограммаXDTO,"CryptoParameters");
МояФабрикаXDTO.ЗаписатьXML(МойXML, ЗначениеXDTOEncrypted,"EncryptAlgorithm");


только получаю

{Форма.Форма.Форма(28)}: Ошибка при вызове метода контекста (ЗаписатьXML)
МояФабрикаXDTO.ЗаписатьXML(МойXML, ЗначениеXDTOEncrypted,"EncryptAlgorithm");
по причине:
Ошибочный порядок записи XDTO
по причине:
Ошибочный порядок записи XML
28 Serginio1
 
20.01.16
18:00
Если записываешь несколько элементов то нужно записать корневой элемент.
29 Serginio1
 
20.01.16
18:05
Схема такая. Пространства имен сам установи. Или без них

ЗаписьXML=Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(Файл);
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента(XMLСтрока("Данные"));
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema";);

МояФабрикаXDTO.ЗаписатьXML(МойXML, ПрограммаXDTO,"CryptoParameters");

МояФабрикаXDTO.ЗаписатьXML(МойXML, ЗначениеXDTOEncrypted,"EncryptAlgorithm");

ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть()
30 Serginio1
 
20.01.16
18:13
Ну чтение соответственно
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
ЧтениеXML.ПерейтиКСодержимому();

ЧтениеXML.Прочитать();


Пока ЧтениеXML.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл

//читаем очередной элемент справочника
Имя=ЧтениеXML.Имя;

ОбъектXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,Имя));
КонецЦикла;

ЧтениеXML.Закрыть();
31 Stim
 
21.01.16
10:37
хм. как-то неправильно записывает:

  <?xml version="1.0" encoding="UTF-8" ?>
- <Data xmlns:CryptoParameters="http://bank.1c.ru/XMLSchema}/Settings/Data/CryptoParameters"; xmlns:Encrypted="http://bank.1c.ru/XMLSchema}/Settings/Data/CryptoParameters/Encrypted">;
- <CryptoParameters xmlns="http://bank.1c.ru/XMLSchema"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
  <CSPName>eToken Base Cryptographic Provider</CSPName>
  <CSPType>1</CSPType>
  <SignAlgorithm>RSA_SIGN</SignAlgorithm>
  <HashAlgorithm>SHA-1</HashAlgorithm>
  </CryptoParameters>
- <EncryptAlgorithm xmlns="http://bank.1c.ru/XMLSchema"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">;
  <EncryptAlgorithm>DES</EncryptAlgorithm>
  </EncryptAlgorithm>
  </Data>
32 Stim
 
21.01.16
10:37
как можно из схемы xsd загрузить всю структуру в xml, тупо пустую?
33 Serginio1
 
21.01.16
11:46
(31) А что тебя смущает, Выгружено 2 объекта
прочитать их можешь через 30
34 Stim
 
21.01.16
12:00
(33) как-то неправильно они выгружены.
EncryptAlgorithm должно быть внутри CryptoParameters
35 Serginio1
 
21.01.16
14:20
Как выгружаешь так и получаешь

МояФабрикаXDTO.ЗаписатьXML(МойXML, ПрограммаXDTO,"CryptoParameters");

МояФабрикаXDTO.ЗаписатьXML(МойXML, ЗначениеXDTOEncrypted,"EncryptAlgorithm");

Тебе нужно присвоитьКакомуто  Свойству

ПрограммаXDTO.КакоетоСвойствоТипаEncrypted=ЗначениеXDTOEncrypted

и записать только ПрограммаXDTO
36 Serginio1
 
21.01.16
14:23
ПрограммаXDTO.КакоетоСвойствоТипаEncryptAlgorithm=ЗначениеXDTOEncrypted
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн