|
СписокXTDO и ОбъектXTDO | ☑ | ||
---|---|---|---|---|
0
Kamik-7
04.02.13
✎
14:50
|
Всем привет. Вопрос нубский, видимо.
Есть xml типа <orders> <order> </order> <order> </order> </orders> Когда order один, то получаю ОбъектXTDO, если несколько - то СписокXTDO. Есстественно, при обходе For Each Order In Orders.order получаем в первом случае ошибку. Что-то я не могу сообразить, как правильно-то сделать, чтобы Orders.order был всегда списком? Городить проверку на тип что-то некравиво. |
|||
1
cleaner
04.02.13
✎
15:10
|
(0) Придется делать проверку на тип. Я так делаю, во всяком случае
|
|||
2
Kamik-7
04.02.13
✎
15:42
|
Хм. Ну ладно.
А если значение в xml пустое (<Company></Company>), то я получаю при типе string (http://www.w3.org/2001/XMLSchema) - Значение ОбъектXDTO!, а не пустую строку |
|||
3
AaNnDdRrEeYy
04.02.13
✎
16:03
|
не надо на тип, в пакете XDTO для свойства orders указать минимально значение 0 и максимальное значение -1
|
|||
4
AaNnDdRrEeYy
04.02.13
✎
16:05
|
(2)>> А если значение в xml пустое (<Company></Company>), то я получаю при типе string (http://www.w3.org/2001/XMLSchema) - Значение ОбъектXDTO!, а не пустую строку
Для правильного чтения файла xml нужно корретно указывать пространство имен, тогда такие случаи не возникнут, система будет определять тип не из xml файла по содержимому а именно из XDTO пакета в конфигурации |
|||
5
Fragster
гуру
04.02.13
✎
16:05
|
(0) нужна правильная схема
|
|||
6
Fragster
гуру
04.02.13
✎
16:07
|
вот тут есть пример: v8: Как сделать так, чтобы фабрика XDTO правильно определяла тип?
|
|||
7
Fragster
гуру
04.02.13
✎
16:08
|
схему можно набросать например в xmlpad
|
|||
8
Fragster
гуру
04.02.13
✎
16:08
|
(4) не всегда есть пакет в конфигурации
|
|||
9
Serginio1
04.02.13
✎
16:21
|
Сделай первую строку дефолтной и не читай её. Помню та же беда была.
|
|||
10
Serginio1
04.02.13
✎
16:23
|
9+ При выгрузке разумеется добавляй строку, а при чтении пропускай.
|
|||
11
alexei366
04.02.13
✎
16:29
|
(9) (10) Да пусть сделает минимум 1 и максимум -1, нафига тут ещё добавлять и пропускать
|
|||
12
alexei366
04.02.13
✎
16:29
|
Ну или скоко максимум допустим*
|
|||
13
Kamik-7
04.02.13
✎
16:32
|
(3) Блин, у меня orders не свойство, а тип.
(4) А можно пример, для особо тупых? |
|||
14
Serginio1
04.02.13
✎
16:33
|
(11) Кстати посмотрел на проблемный тип. Там стоит минимум 1, максимум -1. Нужно поставить минимум 0, максимум -1
|
|||
15
Fragster
гуру
04.02.13
✎
16:40
|
(9) если ты не умеешь пользоваться и сделал костыль, то не заставляй других им пользоваться. здесь правильно - при Фабрика.ПрочитатьXML указать тип
|
|||
16
Serginio1
04.02.13
✎
16:52
|
(15) Проблема была не при загрузке, а при выгрузке. Не обратил внимания на минимальное количество. При этом выгружает как структуру. А сервисом пользовались на C# где классы уже сформированы. Смотри 14.
|
|||
17
Fragster
гуру
04.02.13
✎
16:54
|
(16) если загружать _без_ корректной схемы или не указывая тип, то если 1 подчиненный элемент, то будет ОбъектXDTO, если больше одного - то будет списокXDTO, если нет подчиненных элементов, то будет строка.
|
|||
18
Fragster
гуру
04.02.13
✎
16:56
|
схемой может быть ПакетXDTO в конфигурации
|
|||
19
Fragster
гуру
04.02.13
✎
16:57
|
кстати без указания типа еще и всякие даты/числа не будут в 1с сами преобразовываться в свои типы, а так и будут строками
|
|||
20
alexei366
04.02.13
✎
17:00
|
(19) кстати поперёк маленький вопросик: создаем объект мы на основании типа, и при выгрузке имя корневого элемента получается именем типа, а как создать объект по корневому свойству пакета, и чтоб при выгрузке в xml имя корня было именем корневого свойства пакета?
|
|||
21
Serginio1
04.02.13
✎
17:01
|
(17) Ну вообще то в вэб сервисе указано какой тип. Проблема была именно в минимальном количестве. Во всех других случаях возвращался список. А как ты без схемы читать ОбъектXDTO будешь. При чтении всегда можно получить тип
ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя) |
|||
22
Fragster
гуру
04.02.13
✎
17:02
|
(21) где у автора веб сервис?
|
|||
23
Fragster
гуру
04.02.13
✎
17:03
|
(20)->(6)
|
|||
24
Serginio1
04.02.13
✎
17:06
|
(22) Я писал, про свою ситуацию. А схема должна быть всегда, просто при чтении нужно вычислять тип
ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ФабрикаXDTO.Имя)); И в зависимости от типа и действовать. |
|||
25
alexei366
04.02.13
✎
17:07
|
(23) Видно не совсем ты меня понял, ну ладно не буду эту ветку засорять.
|
|||
26
Fragster
гуру
04.02.13
✎
17:08
|
(24) это написано еще по ссылке в (6), а у тебя какие-то фантазии про веб-сервисы и пакеты XDTO пошли.
|
|||
27
Kamik-7
04.02.13
✎
17:08
|
блин, зафлудили все
|
|||
28
Serginio1
04.02.13
✎
17:09
|
24 Тьфу
ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя)); |
|||
29
Serginio1
04.02.13
✎
17:11
|
(27) Посмотри 14 и 28. Если ты выгружаешь то посмотри на минимальное количество.
|
|||
30
alexei366
04.02.13
✎
17:14
|
(28) А вот кстати , такой метод не пракатит, если не совпадает имя типа в пакете и имя корневого свойства
|
|||
31
Serginio1
04.02.13
✎
17:15
|
(26) В 6 это ссылка на меня. У меня была ошибка которую я и обнаружил в 14. Буду знать. И моя база знаний увеличилась.
Фантазий нет никаких ибо вэб сервисы построены на схеме, но по ней же можно и выгружать в файл. |
|||
32
Serginio1
04.02.13
✎
17:18
|
(30) Почему? Если ты посмотришь текст xml то увидишь, что там прописывается тип. Кстати, а что такое корневое свойство?
|
|||
33
Kamik-7
04.02.13
✎
17:18
|
(29) я загружаю
|
|||
34
Serginio1
04.02.13
✎
17:22
|
(33) Кстати для интереса поинтересуйся какое у них стоит минимальное количество.
|
|||
35
Fragster
гуру
04.02.13
✎
17:32
|
(34) ну, если есть случай, когда получается строка - то вестимо 0
|
|||
36
Serginio1
04.02.13
✎
17:38
|
(35) В моем случае это было минимальное количество 1, максимальное -1 которое я озвучил в 14.
|
|||
37
Kamik-7
04.02.13
✎
19:04
|
Моя схема
<xs:schema xmlns:tns="te" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="te" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="orders"> <xs:complexType> <xs:sequence> <xs:element name="order" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Ordernumber" type="xs:string" minOccurs="1" /> <xs:element name="Items"> <xs:complexType> <xs:sequence > <xs:element name="item" minOccurs="1" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Code" type="xs:string" minOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> все равно order остается ОбъектXTDO. |
|||
38
Kamik-7
04.02.13
✎
19:05
|
и item тоже )
|
|||
39
Fragster
гуру
04.02.13
✎
19:21
|
перенеси все element>complextype в отдельные типы с именами как у element (так будет реально проще)
|
|||
40
Kamik-7
04.02.13
✎
20:51
|
<xs:complexType name="order">
<xs:sequence minOccurs="0"> <xs:element name="partner" type="tns:partner" minOccurs="0" /> <xs:element name="Ordernumber" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> <xs:complexType name="orders"> <xs:complexContent> <xs:extension base="tns:order" /> </xs:complexContent> </xs:complexType> Типа так? |
|||
41
Александр_
Тверь 04.02.13
✎
20:56
|
http://infostart.ru/public/167459/
почитай там все три части, доступно и понятно |
|||
42
Serginio1
05.02.13
✎
11:31
|
<xs:element name="order" minOccurs="1" maxOccurs="unbounded">
Поставь в схеме <xs:element name="order" minOccurs="0" maxOccurs="unbounded"> |
|||
43
Kamik-7
05.02.13
✎
14:48
|
Выдает ошибку формата XDTO модели
<xs:schema xmlns:tns="te" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="te" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="order"> <xs:sequence> <xs:element name="Ordernumber" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:complexType name="orders"> <xs:sequence> <xs:element name="order" type="tns:order" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> <xs:element name="orders" type="tns:orders" /> </xs:schema> <?xml version="1.0" encoding="utf-8" standalone="yes"?> <orders> <order> <Ordernumber>20489</Ordernumber> </order> </orders> Вот что не так тут? |
|||
44
Kamik-7
05.02.13
✎
14:51
|
Загружаю так:
ФайлыXSD = Новый Массив(); ФайлыXSD.Добавить("\\WIN-SERVER\pub\1C\work\test4.xsd"); МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD); OrdersType = МояФабрикаXDTO.Тип("te", "orders"); МойXML = Новый ЧтениеXML; МойXML.ОткрытьФайл("\\WIN-SERVER\pub\1C\work\test.xml"); Orders = ФабрикаXDTO.ПрочитатьXML(МойXML, OrdersType); |
|||
45
Fragster
гуру
05.02.13
✎
14:57
|
МояФабрикаXDTO.ПрочитатьXML
|
|||
46
Kamik-7
05.02.13
✎
15:03
|
да, это просто опечатка
в общем победил. Получается в xml надо типы напрямую указывать? Вот так загрузилось... <?xml version="1.0" encoding="utf-8" standalone="yes"?> <tns:orders xmlns:tns="te" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <tns:order> <tns:Ordernumber>20489</tns:Ordernumber> </tns:order> </tns:orders> |
|||
47
Fragster
гуру
05.02.13
✎
15:05
|
(46) не, если нэймспэйс в схеме и в шапке у xml одинаковый - то все должно работатьт
|
|||
48
Kamik-7
05.02.13
✎
15:11
|
(47) Спасибо, я наконец-то понял :)
|
|||
49
Serginio1
05.02.13
✎
16:43
|
Вообще должно так работать
ЧтениеXML.УстановитьСтроку(стр); ЧтениеXML.ПерейтиКСодержимому(); ТипОбъектаXDTO=ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя); ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОбъектаXDTO); |
|||
50
Serginio1
05.02.13
✎
19:04
|
(46) Тип нужно указывать если это anyType
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |