Имя: Пароль:
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
как то не заработал этот вариант, видимо СтрЗаменить наше всё, буду пока его использовать.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший