|
Как сформировать 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
|
Вернее смотри v8: XDTO-пакет, вложенный элемент
|
|||
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |