|
Как в XSD-схеме задать массив из одного элемента? | ☑ | ||
---|---|---|---|---|
0
D_Pavel
23.09.15
✎
06:58
|
Продукция в схеме так обозначена:
<xs:complexType name="Поставщик"> <xs:element name="Продукция" type="tns:Продукция" maxOccurs="unbounded" /> </xs:complexType> Если в XML много строк с Продукцией, то когда разбираю XML с помощью Фабрики, то все ок, в 1С Поставщик.Продукция - это массив: <Поставщик> <Продукция ПN="1"/> <Продукция ПN="2"/> <Продукция ПN="3"/> </Поставщик> Если строка одна, то 1С считает это не массивом, а объектом: (Поставщик.Продукция - это объект) <Поставщик> <Продукция ПN="1"/> </Поставщик> Как сделать чтобы 1С всегда считала Продукцию массивом, даже если ее всего один элемент? Может в схеме как-то по другому задать? |
|||
1
spock
23.09.15
✎
07:08
|
Так?
<xs:complexType name="Поставщик"> <xs:sequence> <xs:element name="Продукция" type="tns:Продукция" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> |
|||
2
D_Pavel
23.09.15
✎
07:10
|
(1) нет, не так. Это то же самое что и у меня. Все равно как объект воспринимает :(
|
|||
3
D_Pavel
23.09.15
✎
08:44
|
Ап
|
|||
4
D_Pavel
23.09.15
✎
09:08
|
Как же долго просыпаются умные одноэсники на западе... А от восточных совсем никакой пользы.
|
|||
5
Fragster
гуру
23.09.15
✎
09:17
|
(0) а смысл сего действия?
|
|||
6
D_Pavel
23.09.15
✎
09:20
|
(5) Чтобы не получить исключение при обходе массива циклом, и не добавлять проверок на тип.
|
|||
7
Serginio1
23.09.15
✎
10:33
|
Поставь minOccurs="0"
|
|||
8
Fragster
гуру
23.09.15
✎
10:36
|
(7) это не сделает его массивом
|
|||
9
Fragster
гуру
23.09.15
✎
10:38
|
проблема в том, что в (0) неправильно читается. прошу привести пример кода и первой строки XML
|
|||
10
Fragster
гуру
23.09.15
✎
10:39
|
а также нужно учитывать то, что 1с не умеет работать с "неопределенным" пространством имен, т.е. и в XML и в схеме оно должно быть.
|
|||
11
RomaH
naïve
23.09.15
✎
10:40
|
ДанныеСчета = Неопределено;
ИндексСчета = 0; Пока ПолучитьУзелСписка(ДанныеПациента.register_accounts.personal_account,ИндексСчета,ДанныеСчета) Цикл Функция ПолучитьУзелСписка(СписокXDTO,Индекс,ЭлементСписка) Если ТипЗнч(СписокXDTO) = Тип("ОбъектXDTO") И Индекс = 0 Тогда ЭлементСписка = СписокXDTO; Индекс = Индекс + 1; Возврат Истина; КонецЕсли; Если ТипЗнч(СписокXDTO) = Тип("СписокXDTO") И Индекс < СписокXDTO.Количество() Тогда ЭлементСписка = СписокXDTO.Получить(Индекс); Индекс = Индекс + 1; Возврат Истина; КонецЕсли; Индекс = Индекс + 1; Возврат Ложь; КонецФункции |
|||
12
Fragster
гуру
23.09.15
✎
11:09
|
(11) Интересует фрагмент ФабрикаXDTO.ПрочитатьXML(), как получается параметр "тип". Ну и фрагмент XML, где определяется пространство имен (чаще всего - корневой тег)
|
|||
13
D_Pavel
23.09.15
✎
11:14
|
(9) У меня правильно читается. Что именно не читается?
Как пример кода может повлиять на то что человек знающий ответ на мой вопрос зайдет в эту тему? |
|||
14
Fragster
гуру
23.09.15
✎
11:15
|
(13) я знаю ответ на твой вопрос. у тебя XML читается не как объект твоего типа из схемы, а как anytype.
|
|||
15
D_Pavel
23.09.15
✎
11:16
|
(10) Пространство имен конечно же есть, иначе бы ошибка возникла еще на чтении XML.
|
|||
16
D_Pavel
23.09.15
✎
11:17
|
(14) Понял тебя. Сейчас проверю.
|
|||
17
Serginio1
23.09.15
✎
11:27
|
(8) Делает прекрасно
Такой массив будет прекрасно считываться и с одним элементом minOccurs="0" maxOccurs="unbounded"/> А вот такой minOccurs="1" maxOccurs="unbounded"/> При одном элементе будет давать элемент, а не список |
|||
18
D_Pavel
23.09.15
✎
11:28
|
(17) Спасибо, КО! Темку можно закрыть.
|
|||
19
Fragster
гуру
23.09.15
✎
11:41
|
(17) нифига.
(18) нифига. |
|||
20
Fragster
гуру
23.09.15
✎
11:41
|
вот правильное чтение:
Схема = "<?xml version=""1.0"" encoding=""utf-8""?> |<xs:schema xmlns=""test"" targetNamespace=""test"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" | elementFormDefault=""qualified"" attributeFormDefault=""unqualified""> | <xs:element name=""test"" type=""test""/> | <xs:complexType name=""test""> | <xs:sequence> | <xs:element minOccurs=""1"" maxOccurs=""unbounded"" name=""ttt"" type=""xs:string""/> | </xs:sequence> | </xs:complexType> |</xs:schema>"; ИмяФайлаСхемы = ПолучитьИмяВременногоФайла("xsd"); ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(Схема); ТекстовыйДокумент.Записать(ИмяФайлаСхемы); Фабрика = СоздатьФабрикуXDTO(ИмяФайлаСхемы); УдалитьФайлы(ИмяФайлаСхемы); XML = "<?xml version = ""1.0"" encoding = ""utf-8""?> |<test xmlns=""test"" | xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" | xsi:schemaLocation=""test file:///X:/tmp/Untitled.xsd""> | <ttt>Привет!</ttt> |</test>"; Чтение = Новый ЧтениеXML; Чтение.УстановитьСтроку(XML); Тип = Фабрика.Тип("test","test"); Объект = Фабрика.ПрочитатьXML(Чтение, Тип); ТипТТТ = ТипЗнч(Объект.ttt); |
|||
21
Fragster
гуру
23.09.15
✎
11:43
|
(20) хоть minOccurs="1", хоть 0, все равно будет список при maxOccurs="unbounded"
|
|||
22
Fragster
гуру
23.09.15
✎
11:44
|
а вот при отсутствии указания maxOccurs указание minOccurs в 0 делает тег необязательным. А свойство у результирующего объекта все равно будет.
|
|||
23
Serginio1
23.09.15
✎
11:47
|
(19) Ну да. Проверь. Я уже на эти грабли наступал.
Заодно посмотри чему равен minOccurs по умолчанию |
|||
24
Fragster
гуру
23.09.15
✎
11:48
|
(23) ты код запустил?
|
|||
25
D_Pavel
23.09.15
✎
11:50
|
(20) Зачем указываешь в XML это
xsi:schemaLocation=""test file:///X:/tmp/Untitled.xsd"" если у тебя в прочтении XML фабрикой и так указан тип? Тип = Фабрика.Тип("test","test"); Объект = Фабрика.ПрочитатьXML(Чтение, Тип); |
|||
26
Fragster
гуру
23.09.15
✎
11:55
|
(25) это потому что XML делался во внешнем редакторе. можно удалить, поведение кода не изменится.
|
|||
27
D_Pavel
23.09.15
✎
12:03
|
(26) Спасибо! Темку можно закрыть.
|
|||
28
Serginio1
23.09.15
✎
12:07
|
Для примера сделал с minOccurs=""1""
Объект=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http:/Test5","Поставщик")); Объект.Продукция.Добавить("ОдинЭлемент"); ЗаписьXML= новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML,Объект); Стр=ЗаписьXML.Закрыть(); ЧтениеXML= новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(стр); Объект=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)); Сообщить(Объект.Продукция); В отладчике показывает Объект.Продукция это строка. Стоит добавить второй элемент Объект.Продукция.Добавить("ВторойЭлемент"); И уже показывает СписокXDTO |
|||
29
Serginio1
23.09.15
✎
12:10
|
Но 1С генерит такую схему
<xs:schema xmlns:tns="http:/Test5" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http:/Test5" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:complexType name="Поставщик"> <xs:sequence> <xs:element name="Продукция" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema> |
|||
30
Fragster
гуру
23.09.15
✎
12:10
|
(28) я хз, что там у тебя в пакете. код (20) запускал? работает?
|
|||
31
Fragster
гуру
23.09.15
✎
12:11
|
убрал в коде minOccurs вообще. все равно список.
|
|||
32
Serginio1
23.09.15
✎
12:12
|
(30) Я сейчас добавлю в схему в 29 и проверю. Смысл то в тм, что 1С генерит такую схему при минимальном количестве 1
|
|||
33
Serginio1
23.09.15
✎
12:12
|
(31) Проверь 28
|
|||
34
Serginio1
23.09.15
✎
12:16
|
Кстати в отладчике показывает минимальное количество 1
|
|||
35
Fragster
гуру
23.09.15
✎
12:24
|
(33) ты забыл ЧтениеXML.ПерейтиКСодержимому();
|
|||
36
Fragster
гуру
23.09.15
✎
12:25
|
(35)+ и у тебя ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя) из-за этого возвращает неопределено.
|
|||
37
Serginio1
23.09.15
✎
12:28
|
(35) Да она и так читает.
Твоя показыват список Кстати строка такая <Поставщик xmlns="http:/Test5" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Продукция>ОдинЭлемент</Продукция> </Поставщик> Сечас поставлю (36) Я создал тип в тестовой конфигурации. Сейчас через файл сделаю |
|||
38
Serginio1
23.09.15
✎
12:28
|
Но смысл в том, что 1С генерит при минимальном количестве схему 29. Проверь
|
|||
39
Fragster
гуру
23.09.15
✎
12:33
|
(38) все хорошо со схемой. на то, список это или объект - влияет maxOccurs. если там не 1, то будет список.
у тебя неправильно идет определение типа. вернее в него передаются неверные параметры. проверь в отладчике - если не сделать Чтение.ПерейтиКСодержимому(), то у тебя получается Фабрика.Тип("",""); |
|||
40
Serginio1
23.09.15
✎
12:38
|
(39) Посыпаю свою голову пеплом Забыл ЧтениеXML.ПерейтиКСодержимому();
|
|||
41
D_Pavel
23.09.15
✎
12:38
|
В общем проверил, minOccurs 0 не влияет.
|
|||
42
Fragster
гуру
23.09.15
✎
12:40
|
что-то я добрый сегодня. надо было в (12) и (14) вас обоих тыкать до просветления
|
|||
43
Serginio1
23.09.15
✎
12:49
|
(42) Еще раз прошу прощение и большое спасибо за поправку и добродушие. Просто давным давно работа с с сайтом на Asp.Net и там формировались классы как Object и при 1 элементе давали не массив а элемент. Это была такая реализация в Net. На 1С не проверял.
в 28 чтение происходило через AnyType |
|||
44
D_Pavel
23.09.15
✎
12:54
|
(42) Я и так на (14) понял в чем собака порылась.
|
|||
45
D_Pavel
23.09.15
✎
13:04
|
-------Новый вопрос-------
как быть если файл прислали без указанного xmlns ? |
|||
46
D_Pavel
23.09.15
✎
13:30
|
(45) Up
|
|||
47
Serginio1
23.09.15
✎
13:43
|
(45) Самому добавить
|
|||
48
Serginio1
23.09.15
✎
13:45
|
||||
49
D_Pavel
23.09.15
✎
13:50
|
(47) Строку просто заменить? Ок, годится.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |