Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Builder c++ 6 + XML Data Binding и интерфейсы / 12 сообщений из 12, страница 1 из 1
01.07.2016, 18:30:04
    #39266661
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
Пока не знаю что конкретно спрашивать, просто обрисую проблему.
Работал с XML через XML Data Binding, создавал классы/интерфейсы по XML файлу и особо не заморачивался как оно работает.
Понадобилось использовать XML Data Binding со схемами xsd и тут случилась подстава.
То, что билдер не смог переварить xsd-файл это я пережил. Засада случилась в самой схеме.
Рабочий XML файл выглядит приблизительно так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0" encoding="UTF-8"?>
<ns:Documents Version="1.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"
  xmlns:wt="http://fsrar.ru/WEGAIS/ConfirmTicket">
  <ns:Owner>
    <ns:FSRAR_ID>010000006339</ns:FSRAR_ID>
  </ns:Owner>
  <ns:Document>
    <ns:ConfirmTicket>
      <wt:Header>
        <wt:IsConfirm>Accepted</wt:IsConfirm>
        <wt:TicketNumber>TTN-0003314515-Confirm</wt:TicketNumber>
        <wt:TicketDate>2016-02-01</wt:TicketDate>
        <wt:WBRegId>TTN-0003314515</wt:WBRegId>
        <wt:Note>Подтверждение акта приемки.(Авто)</wt:Note>
      </wt:Header>
    </ns:ConfirmTicket>
  </ns:Document>
</ns:Documents>


А xsd-схема начинается от ConfirmTicket:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:ns="http://fsrar.ru/WEGAIS/ConfirmTicket"
           targetNamespace="http://fsrar.ru/WEGAIS/ConfirmTicket"
           xmlns:c="http://fsrar.ru/WEGAIS/Common"

           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
>
  <xs:import namespace="http://fsrar.ru/WEGAIS/Common" schemaLocation="EGCommon.xsd"/>
  <xs:complexType name="ConfirmTicketType">
    <xs:annotation>
      <xs:documentation>Подтверждение акта разногласий для Товарно-Транспортной Накладной</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="Identity" type="c:IdentityType" nillable="false" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Идентификатор документа (клиентский, к заполнению необязательный)</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Header">
        <xs:complexType>
          <xs:all>
            <xs:element name="IsConfirm" type="ns:ConclusionType" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>Подтвержден/не подтвержден</xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="TicketNumber" type="c:NoEmptyString50" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>Номер подтверждения</xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="TicketDate" type="c:DateNoTime" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>Дата составления подтверждения</xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="WBRegId" type="c:NoEmptyString50" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>ИД накладной в системе</xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="Note" minOccurs="0" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>Примечание</xs:documentation>
              </xs:annotation>
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:maxLength value="500"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
     </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="ConclusionType">
    <xs:annotation>
      <xs:documentation>Вид результата фиксации</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Accepted"/>
      <xs:enumeration value="Rejected"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>



И вот начальный кусок XML меня ставит в тупик.
Сейчас пытаюсь делать так, - генерить по xsd схеме и подставлять туда кусок XML из файла начиная с ConfirmTicket. Но пока что-то не получается.
2 способ это к каждой схеме дописывать недостающий начальный кусок, но это несколько геморно и странно.
3 способ, в каждый сгенеренный файл прописывать недостающий кусок кода, но сдается мне, что это еще более проблемный и странный вариант.

Собственно вопрос, правильная ли моя идея с " генерить по xsd схеме и подставлять туда кусок XML из файла начиная с ConfirmTicket." и почему у меня не работает )))
...
Рейтинг: 0 / 0
01.07.2016, 19:17:12
    #39266680
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
didgikА xsd-схема начинается от ConfirmTicket:Нет. Схема описывает элементы в пространстве именdidgik
Код: xml
1.
targetNamespace="http://fsrar.ru/WEGAIS/ConfirmTicket"

а именно Identy и Header. Описание Header полностью соответствует XML. Сам же XML имеет корневой элемент Documents в пространстве именdidgik
Код: xml
1.
xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"

Вот и ищите схему для этого пространства имен. А эта схема будет внутри включать в себя приведенную схему при помощи такой конструкции
Код: xml
1.
<xs:import namespace="http://fsrar.ru/WEGAIS/ConfirmTicket" schemaLocation="YourSchema.xsd"/>

Вот именно на эту схему и нужно натравить парсер XML Data Binding и молиться, чтобы он понимал импорты и пространства имен
...
Рейтинг: 0 / 0
01.07.2016, 20:15:15
    #39266699
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
_Vasilisk_, спасиб, все получилось!

пространства имен к сожалению он не понимает, даже от 10 версии, но всеж меньше ручной работы.
...
Рейтинг: 0 / 0
01.07.2016, 23:02:44
    #39266735
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
А подскажите еще такую вещь.
XML Data Binding формирует код приблизительно такого вида:
Код: plaintext
1.
2.
3.
4.
_di_IHeader_ctc __fastcall TConfirmTicketType_ctc::Get_Header()
{
  return (_di_IHeader_ctc) GetChildNodes()->Nodes[WideString("Header")];
};


но в таком виде не поддерживаться пространства имен и приходится переписывать на:
Код: plaintext
1.
2.
3.
_di_IHeader_ctc __fastcall TConfirmTicketType_ctc::Get_Header(){
  return (_di_IHeader_ctc) GetChildNodes()->FindNode(WideString("Header"), ctc_Namespace);
}


Но в таком виде пропадет фишка с автосозданием ноды при формировании XML файла.
Как бы это побороть?
...
Рейтинг: 0 / 0
02.07.2016, 12:37:17
    #39266802
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
didgikКак бы это побороть?Как то так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IXMLDOMNode __fastcall TConfirmTicketType_ctc::Get_Node(WideString AName, WideString ANS){
  IXMLDOMNode res = GetChildNodes()->FindNode(AName, ANS);
  if (!res) (
    res = OwnerDocument->CreateNode(NODE_ELEMENT, AName, ANS);
    GetChildNodes()->appendChild(res);
  }
  return res;
}

_di_IHeader_ctc __fastcall TConfirmTicketType_ctc::Get_Header(){
  return (_di_IHeader_ctc) Get_Node("Header", ctc_Namespace);
}
...
Рейтинг: 0 / 0
03.07.2016, 17:52:05
    #39267008
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
_Vasilisk_, да, я приблизительно так и думал, просто надеялся, может есть какой способ указывать пространство имен для текущего массива Nodes, т.е. как то упростить ручную работу по изменению автосгенерированого кода.
...
Рейтинг: 0 / 0
03.07.2016, 20:44:05
    #39267029
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
didgikкак то упростить ручную работу по изменению автосгенерированого кода.Replace All GetChildNodes()->Nodes to Nodes свойство Nodes определить как приватное свойство класса TConfirmTicketType_ctc или родителя
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.10.2017, 13:18:33
    #39536842
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
Привет.
А подскажите еще ситуацию.
Есть вот такой XSD:
это CommonV3:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:ns="http://fsrar.ru/WEGAIS/CommonV3"
           xmlns:c="http://fsrar.ru/WEGAIS/Common"
           targetNamespace="http://fsrar.ru/WEGAIS/CommonV3"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
>
  <xs:import namespace="http://fsrar.ru/WEGAIS/Common" schemaLocation="EGCommon.xsd"/>


  <!--новые схемы для помарочного учета-->
  <xs:complexType name="AMCforDocType">
    <xs:annotation>
      <xs:documentation>Список считанных кодов марок</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="amc" type="c:PDF417String" nillable="false" minOccurs="1" maxOccurs="unbounded" >
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="boxtype">
    <xs:sequence>
      <xs:element name="boxnum" type="c:NoEmptyString" minOccurs="1" maxOccurs="1"/>
      <xs:choice>
        <xs:element name="bl" type="ns:boxtype" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="boxnum" type="c:NoEmptyString" minOccurs="0" maxOccurs="unbounded"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="bktype">
    <xs:annotation>
      <xs:documentation>Список считанных кодов марок</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="bk" type="c:PDF417String" nillable="false" minOccurs="1" maxOccurs="unbounded" >
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="boxamcType">
    <xs:annotation>
      <xs:documentation>информация об упаковке с марками</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="boxnumber" type="c:NoEmptyString" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Номер коробки(упаковки)</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="amclist" type="ns:AMCforDocType" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Перечень считанных кодов марок</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>


  <xs:complexType name="MarkInfoTypeBC">
    <xs:annotation>
      <xs:documentation>Информация о марках</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="boxpos" type="ns:boxamcType" minOccurs="1" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation>Номер коробки(упаковки)</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="InformF2TypeItemBC">
    <xs:annotation>
      <xs:documentation>Запись в справке 2 к ТТН, Информация о предыдущих отгрузках</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="F2RegId" type="c:NoEmptyString50" default="FIRSTSHIPMENT" nillable="false" minOccurs="1" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Регистрационный номер раздела справки 2</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="MarkInfo" type="ns:MarkInfoTypeBC" nillable="false"  minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Информация о марках</xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <!--новые схемы для помарочного учета-->

</xs:schema>



и сам ReplyRestBCode
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema version="1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:ns="http://fsrar.ru/WEGAIS/ReplyRestBCode"
           targetNamespace="http://fsrar.ru/WEGAIS/ReplyRestBCode"
           xmlns:c="http://fsrar.ru/WEGAIS/Common"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:ce="http://fsrar.ru/WEGAIS/CommonV3"
>
  <xs:import namespace="http://fsrar.ru/WEGAIS/Common" schemaLocation="EGCommon.xsd"/>
  <xs:import namespace="http://fsrar.ru/WEGAIS/CommonV3" schemaLocation="EGCommonV3.xsd"/>

  <xs:complexType name="ReplyRestBCode">
    <xs:annotation>
      <xs:documentation>Ответ на запрос об остатках по складу (сокращенный)</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="RestsDate" type="c:DateWTime" minOccurs="1" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Остатки на эту дату</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Inform2RegId" type="c:NoEmptyString50" nillable="false" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation>Справка Б</xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="MarkInfo" type="ce:AMCforDocType" nillable="false" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  </xs:schema>



Проблему выдал <xs:element name="MarkInfo" type="ce:AMCforDocType" nillable="false" minOccurs="0" maxOccurs="unbounded"/>

XML Data Binding разродился приблизительно нижеследующим:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
__interface INTERFACE_UUID("{F16B2874-9CE0-41EA-9BE3-910B00A56D61}") IReplyRestBCode_rsbc : public IXMLNode
{
public:
  // Property Accessors
  virtual WideString __fastcall Get_RestsDate() = 0;
  virtual WideString __fastcall Get_Inform2RegId() = 0;
  virtual _di_IAMCforDocType_cevList __fastcall Get_MarkInfo() = 0;
  virtual void __fastcall Set_RestsDate(WideString Value) = 0;
  virtual void __fastcall Set_Inform2RegId(WideString Value) = 0;
  // Methods & Properties
  __property WideString RestsDate = { read=Get_RestsDate, write=Set_RestsDate };
  __property WideString Inform2RegId = { read=Get_Inform2RegId, write=Set_Inform2RegId };
  __property _di_IAMCforDocType_cevList MarkInfo = { read=Get_MarkInfo };

class TReplyRestBCode_rsbc : public TXMLNode, public IReplyRestBCode_rsbc
{
  __IXMLNODE_IMPL__
private:
  _di_IAMCforDocType_cevList FMarkInfo;
protected:
  // IReplyRestBCode_rsbc
  virtual WideString __fastcall Get_RestsDate();
  virtual WideString __fastcall Get_Inform2RegId();
  virtual _di_IAMCforDocType_cevList __fastcall Get_MarkInfo();
  virtual void __fastcall Set_RestsDate(WideString Value);
  virtual void __fastcall Set_Inform2RegId(WideString Value);
public:
  virtual void __fastcall AfterConstruction(void);
};
};


И теперь копилятор ругается на две строки
на первую желтую:
[C++ Error] WB_DOC_SINGLE_01.h(5962): E2462 'virtual' can only be used with non-template member functions
[C++ Error] WB_DOC_SINGLE_01.h(5962): E2344 Earlier declaration of 'IReplyRestBCode_rsbc::_di_IAMCforDocType_cevList'

на вторую:
[C++ Error] WB_DOC_SINGLE_01.h(5968): E2238 Multiple declaration for 'IReplyRestBCode_rsbc::_di_IAMCforDocType_cevList'

Собственно понятно, он не прописал в начале в интерфейсах типа:
__interface Iboxtype_cevList;
typedef System::DelphiInterface<Iboxtype_cevList> _di_Iboxtype_cevList;

вот _di_Iboxtype_cevList прописал, а _di_IAMCforDocType_cevList нет.
И в описании класса выделил только
private:
_di_IAMCforDocType_cevList FMarkInfo;
больше никаких списков так не оформлял.

Так как с XML и интерфейсами у меня в голове туго, я никак не соображу, глюк это XML Data Binding или так и должно быть.
И как побороть эту проблему.
...
Рейтинг: 0 / 0
14.11.2017, 02:10:59
    #39552580
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
Народ, есть какие нибудь идеи? А то я так и не соображу пока что делать.
...
Рейтинг: 0 / 0
15.11.2017, 01:36:17
    #39553183
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
Решил _di_IAMCforDocType_cevList ручками оформить по аналогии с _di_IAMCforDocType_cev
так это глюкало выдало ошибку:
...
Рейтинг: 0 / 0
15.11.2017, 11:44:34
    #39553351
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
didgik, с 6-й стройкой практически не работал и насколько хорошо там работает ulink на практике не в курсе (хотя не вижу препятствий) но начиная с 2006-й полностью отказался от родного линкера
...
Рейтинг: 0 / 0
15.11.2017, 13:58:51
    #39553498
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder c++ 6 + XML Data Binding и интерфейсы
xe2 выдает ошибку
Код: pascal
1.
2.
[ILINK32 Error] Error: Unresolved external '__fastcall Xml::Xmldoc::TXMLNode::~TXMLNode()' referenced from C:\USERS\USER\DOCUMENTS\RAD STUDIO\PROJECTS\WIN32\DEBUG\WB_DOC_SINGLE_01.OBJ
[ILINK32 Error] Error: Unable to perform link


а берлин линкует уже нормально. Правда не проверял, работает ли )
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Builder c++ 6 + XML Data Binding и интерфейсы / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]