Имя: Пароль:
1C
1С v8
Ошибка модели XDTO: Дублирование имени свойства
0 tan76
 
10.04.17
11:29
Проблема следующая, в хмл файле который получен с вебсервиса есть пары элементов с одинаковым именем. Сооветсвено при попытке загрузить сжему пакета получаем следующие:
Ошибка проверки модели XDTO: xdto-objectType-3.1.2    тип: Transaction    пакет: http://www.sample-package.org
Дублирование имени свойства 'APMReferenceID'

Подскажите есть способ обойти эти грабли?

Схема такая:

<xs:schema xmlns:tns="http://www.sample-package.org"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://www.sample-package.org"; attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:complexType name="Response">
        <xs:sequence>
            <xs:element name="RequestID" type="xs:ID"/>
            <xs:element name="FromDate" type="xs:dateTime"/>
            <xs:element name="ToDate" type="xs:dateTime"/>
            <xs:element name="PageTransactionsCount" type="xs:byte"/>
            <xs:element name="Transaction" type="tns:Transaction" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="Type" type="xs:string"/>
        <xs:attribute name="Version" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="Transaction">
        <xs:sequence>
            <xs:element name="TransactionID" type="xs:int"/>
            <xs:element name="ClientName" type="xs:string"/>
            <xs:element name="RelatedTransactionID" type="xs:int"/>
            <xs:element name="ClientUniqueID" type="xs:string"/>
            <xs:element name="Result" type="xs:string"/>
            <xs:element name="Reason" type="xs:string"/>
            <xs:element name="AuthCode" type="xs:string"/>
            <xs:element name="Amount" type="xs:float"/>
            <xs:element name="Currency" type="xs:string"/>
            <xs:element name="UserID" type="xs:string"/>
            <xs:element name="TransactionDate" type="xs:dateTime"/>
            <xs:element name="TransactionType" type="xs:string"/>
            <xs:element name="IsRebill" type="xs:boolean"/>
            <xs:element name="MembershipID" type="xs:string"/>
            <xs:element name="Bank" type="xs:string"/>
            <xs:element name="CardCompany" type="xs:string"/>
            <xs:element name="Last4Digits" type="xs:short"/>
            <xs:element name="Email" type="xs:string"/>
            <xs:element name="FirstName" type="xs:string"/>
            <xs:element name="LastName" type="xs:string"/>
            <xs:element name="WebSite" type="xs:string"/>
            <xs:element name="ShopID" type="xs:byte"/>
            <xs:element name="CreditTypeId" type="xs:byte"/>
            <xs:element name="APMTransactionID" type="xs:string"/>
            <xs:element name="APMReferenceID" type="xs:string"/>
            <xs:element name="Bin" type="xs:int"/>
            <xs:element name="ExpDate" type="xs:short"/>
            <xs:element name="Address" type="xs:string"/>
            <xs:element name="City" type="xs:string"/>
            <xs:element name="State" type="xs:string"/>
            <xs:element name="ZipCode" type="xs:string"/>
            <xs:element name="Country" type="xs:string"/>
            <xs:element name="IPAddress" type="xs:string"/>
            <xs:element name="Phone" type="xs:string"/>
            <xs:element name="ReferenceID" type="xs:string"/>
            <xs:element name="IsVoiceAuth" type="xs:boolean"/>
            <xs:element name="RequestID" type="xs:string"/>
            <xs:element name="UniqueCC" type="xs:string"/>
            <xs:element name="ECI" type="xs:byte"/>
            <xs:element name="ExternalAccountID" type="xs:string"/>
            <xs:element name="APMReferenceID" type="xs:string"/>
            <xs:element name="ProductID" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="TransactionID" type="xs:int"/>
    </xs:complexType>
</xs:schema>


Фрагмент файла XML:

<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.sample-package.org"; Type="Transactions" Version="1.1.6">
   <RequestID>3528276d-3df0-4c90-a56f-987f7c7bddcd</RequestID>
   <FromDate>2017-03-17 00:00:00</FromDate>
   <ToDate>2017-03-17 23:59:59</ToDate>
   <PageTransactionsCount>89</PageTransactionsCount>
   <Transaction TransactionID="482390311">
      <TransactionID>482390311</TransactionID>
      <ClientName>Awadticket Ltd 3D</ClientName>
      <RelatedTransactionID>0</RelatedTransactionID>
      <ClientUniqueID>a32a7453-30f2-4e5b-9d6b-7be5fef140db</ClientUniqueID>
      <Result>Approved</Result>
      <Reason />
      <AuthCode />
      <Amount>5.59</Amount>
      <Currency>EUR</Currency>
      <UserID />
      <TransactionDate>2017-03-17 10:52:54</TransactionDate>
      <TransactionType>Auth3D</TransactionType>
      <IsRebill>false</IsRebill>
      <MembershipID />
      <Bank>Safecharge Acquirer - MasterCard</Bank>
      <CardCompany>MasterCard</CardCompany>
      <Last4Digits>1013</Last4Digits>
      <Email />
      <FirstName />
      <LastName />
      <WebSite />
      <ShopID>0</ShopID>
      <CreditTypeId>0</CreditTypeId>
      <APMTransactionID />
      <APMReferenceID />
      <Bin>548673</Bin>
      <ExpDate>1117</ExpDate>
      <Address />
      <City />
      <State />
      <ZipCode />
      <Country>RU</Country>
      <IPAddress />
      <Phone />
      <ReferenceID />
      <IsVoiceAuth>false</IsVoiceAuth>
      <RequestID />
      <UniqueCC>Qdu4lEUWJTtBz37oeBS9SGcNcrY=</UniqueCC>
      <ECI>7</ECI>
      <ExternalAccountID />
      <APMReferenceID />
      <ProductID />
   </Transaction>
   <Transaction TransactionID="482390373">
      <TransactionID>482390373</TransactionID>
      <ClientName>Awadticket Ltd 3D</ClientName>
      <RelatedTransactionID>0</RelatedTransactionID>
      <ClientUniqueID>a32a7453-30f2-4e5b-9d6b-7be5fef140db</ClientUniqueID>
      <Result>Approved</Result>
      <Reason />
      <AuthCode />
      <Amount>15.5895</Amount>
      <Currency>EUR</Currency>
      <UserID />
      <TransactionDate>2017-03-17 10:52:59</TransactionDate>
      <TransactionType>Auth3D</TransactionType>
      <IsRebill>false</IsRebill>
      <MembershipID />
      <Bank>Safecharge Acquirer - MasterCard</Bank>
      <CardCompany>MasterCard</CardCompany>
      <Last4Digits>1013</Last4Digits>
      <Email />
      <FirstName />
      <LastName />
      <WebSite />
      <ShopID>0</ShopID>
      <CreditTypeId>0</CreditTypeId>
      <APMTransactionID />
      <APMReferenceID />
      <Bin>548673</Bin>
      <ExpDate>1117</ExpDate>
      <Address />
      <City />
      <State />
      <ZipCode />
      <Country>RU</Country>
      <IPAddress />
      <Phone />
      <ReferenceID />
      <IsVoiceAuth>false</IsVoiceAuth>
      <RequestID />
      <UniqueCC>Qdu4lEUWJTtBz37oeBS9SGcNcrY=</UniqueCC>
      <ECI>7</ECI>
      <ExternalAccountID />
      <APMReferenceID />
      <ProductID />
   </Transaction>
</Response>
1 tan76
 
10.04.17
13:36
ап
2 Рэйв
 
10.04.17
13:39
убрать один из них, что тут думать
3 Рэйв
 
10.04.17
13:39
Или дать другое имя
4 tan76
 
10.04.17
13:46
я не могу убрать, не я генерю файл
5 tan76
 
10.04.17
13:47
я лишь схему сделал
6 tan76
 
10.04.17
13:48
Мне нужно так составить схему чтоб игнорировать этот повтор или совсем не читать эти колонки. Если это возможно конечно..
7 Fragster
 
гуру
10.04.17
13:51
у Transaction последовательный = истина
а у APMReferenceID минимальное количество = 0, максимальное -1

ну и гемор с заполнением - добавлять в нужные места этот APMReferenceID уже не помню как, но не через обычный список.

Тот, кто формат сочинял - походу с головой не дружит. Ну, или мазохист.
8 Fragster
 
гуру
10.04.17
13:52
еще можно _попробовать_ обозвать второй свойство APMReferenceID2 и указать у него локальное имя
9 Fragster
 
гуру
10.04.17
13:53
но хз, будет ли работать
10 tan76
 
10.04.17
13:55
(8) не взлетело, пробовал
(7) сейчас проверю
11 Fragster
 
гуру
10.04.17
13:57
если только читать такие файлы, то попроще
12 Fragster
 
гуру
10.04.17
13:58
ну и можно минимальное = 2 максимальное = 2 поставить, если их действительно два
13 tan76
 
10.04.17
14:24
Ребята заработало, фрагстеру особое спасибо. Окончательный варинат схемы такой:

<xs:schema xmlns:tns="http://www.sample-package.org"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://www.sample-package.org"; attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:complexType name="Response">
        <xs:sequence>
            <xs:element name="RequestID" type="xs:ID"/>
            <xs:element name="FromDate" type="xs:dateTime"/>
            <xs:element name="ToDate" type="xs:dateTime"/>
            <xs:element name="PageTransactionsCount" type="xs:byte"/>
            <xs:element name="Transaction" type="tns:Transaction" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="Type" type="xs:string"/>
        <xs:attribute name="Version" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="Transaction">
        <xs:choice>
            <xs:element name="TransactionID" type="xs:int"/>
            <xs:element name="ClientName" type="xs:string"/>
            <xs:element name="RelatedTransactionID" type="xs:int"/>
            <xs:element name="ClientUniqueID" type="xs:string"/>
            <xs:element name="Result" type="xs:string"/>
            <xs:element name="Reason" type="xs:string"/>
            <xs:element name="AuthCode" type="xs:string"/>
            <xs:element name="Amount" type="xs:decimal"/>
            <xs:element name="Currency" type="xs:string"/>
            <xs:element name="UserID" type="xs:string"/>
            <xs:element name="TransactionDate" type="xs:dateTime"/>
            <xs:element name="TransactionType" type="xs:string"/>
            <xs:element name="IsRebill" type="xs:boolean"/>
            <xs:element name="MembershipID" type="xs:string"/>
            <xs:element name="Bank" type="xs:string"/>
            <xs:element name="CardCompany" type="xs:string"/>
            <xs:element name="Last4Digits" type="xs:short"/>
            <xs:element name="Email" type="xs:string"/>
            <xs:element name="FirstName" type="xs:string"/>
            <xs:element name="LastName" type="xs:string"/>
            <xs:element name="WebSite" type="xs:string"/>
            <xs:element name="ShopID" type="xs:byte"/>
            <xs:element name="CreditTypeId" type="xs:byte"/>
            <xs:element name="APMTransactionID" type="xs:string"/>
            <xs:element name="APMReferenceID" type="xs:string" maxOccurs="2"/>
            <xs:element name="Bin" type="xs:int"/>
            <xs:element name="ExpDate" type="xs:short"/>
            <xs:element name="Address" type="xs:string"/>
            <xs:element name="City" type="xs:string"/>
            <xs:element name="State" type="xs:string"/>
            <xs:element name="ZipCode" type="xs:string"/>
            <xs:element name="Country" type="xs:string"/>
            <xs:element name="IPAddress" type="xs:string"/>
            <xs:element name="Phone" type="xs:string"/>
            <xs:element name="ReferenceID" type="xs:string"/>
            <xs:element name="IsVoiceAuth" type="xs:boolean"/>
            <xs:element name="RequestID" type="xs:string"/>
            <xs:element name="UniqueCC" type="xs:string"/>
            <xs:element name="ECI" type="xs:byte"/>
            <xs:element name="ExternalAccountID" type="xs:string"/>
            <xs:element name="ProductID" type="xs:string"/>
        </xs:choice>
        <xs:attribute name="TransactionID" type="xs:int"/>
    </xs:complexType>
</xs:schema>
14 tan76
 
10.04.17
14:33
а ещё вопрос, у исходного ответа сервера отсутствует атрибут xmlns="http://www.sample-package.org";;  и я добавляю его через СтрЗаменить(ТекстОтвета,"<Response ","<Response xmlns=""http://www.sample-package.org"";; ");)

может есть какое либо другое, более красивое решение этой задачи?
15 Fragster
 
гуру
10.04.17
14:43
(14) ну, можно через документDOM добавлять... но надо ли?
16 Fragster
 
гуру
10.04.17
14:44
в смысле - работает, не чини
17 Cyberhawk
 
10.04.17
15:05
(14) Есть - писать вручную корневой тэг ответа (ЗаписатьНачалоЭлемента), затем УстановитьСоответствиеПространстваИмен, затем пишешь через фабрику ХМЛ-содержимое, затем ЗаписатьКонецЭлемента
18 tan76
 
10.04.17
15:06
я же не пишу, я только читаю ответ вебсервиса
19 tan76
 
10.04.17
15:08
или имеется ввиду получение этого ответа и запись его у себя локально но уже с xmlns? а потом уже парсить по схеме?
20 Cyberhawk
 
10.04.17
15:09
А, тогда пофиг как
21 Fragster
 
гуру
10.04.17
15:13
что-то типа того (работоспособность не проверял):

    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(СтрокаXML);
    Чтение.ПерейтиКСодержимому();

    Построитель = Новый ПостроительDOM;
    Документ = Построитель.Прочитать(Чтение);    
        Документ.ЭлементДокумента.УстановитьСоответствиеПространстваИмен("", ПространствоИмен, Ложь);


    Чтение = Новый ЧтениеУзловDOM;
    Чтение.Открыть(Документ);
    Чтение.ПерейтиКСодержимому();
    
    ОбъектРезультат = ФабрикаXDTO.ПрочитатьXML(Чтение, ТипXDTO);
22 tan76
 
10.04.17
15:50
как то не заработал этот вариант, видимо СтрЗаменить наше всё, буду пока его использовать.