powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пространство имен в SOAP
8 сообщений из 8, страница 1 из 1
пространство имен в SOAP
    #37647057
Фотография GodFather
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
При обращении к web-сервису формируется (автоматически при помощи SOAP) следующая xml:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
 <?xml version="1.0" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <SOAP-ENV:Body>
- <getPatientInfo xmlns="http://webservice.interaction.medicalhistory.fors.ru/">
  <caseRecordNum>801949</caseRecordNum> 
  </getPatientInfo>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>



Подскажите, как явно указать пространство имен к тегу <caseRecordNum> чтоб получилось:

Код: xml
1.
<caseRecordNum xmlns="">






предоставляю код модуля и сгенерированного wsdl

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TForm1.Button2Click(Sender: TObject);
var l: patientInformation ;
     m: string;
    i: Integer;
begin
  HTTPRIO1.WSDLLocation := 'http://fors-vyatka.ru:9900/interaction/lisService?wsdl';
  HTTPRIO1.Service := 'LisService';
  HTTPRIO1.Port := 'LisServicePort';
  l := patientInformation.Create;

 
  l := (HTTPRIO1 as LisService).getPatientInfo(Edit1.Text) ; //здесь как раз передается значение тега <caseRecordNum>

 Memo1.Lines.Add(l.fio);

 l.Free;
end;



wsdl:

Код: pascal
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.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : C:\Users\&#213;&#224;&#235;&#232;&#235;\Desktop\&#202;&#232;&#240;&#238;&#226; &#206;&#202;&#193; &#203;&#200;&#209;-&#204;&#200;&#209;\lisService.xml
// Encoding : UTF-8
// Version  : 1.0
// (03.02.2012 12:10:47 - 1.33.2.5)
// ************************************************************************ //

unit lisService1;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"
  // !:dateTime        - "http://www.w3.org/2001/XMLSchema"

  patientInformation   = class;                 { "http://webservice.interaction.medicalhistory.fors.ru/" }



  // ************************************************************************ //
  // Namespace : http://webservice.interaction.medicalhistory.fors.ru/
  // ************************************************************************ //
  patientInformation = class(TRemotable)
  private
    Faddress: WideString;
    FbirthDate: TXSDateTime;
    Ffio: WideString;
    Finsurance: WideString;
    Fpolis: WideString;
    Fsex: WideString;
  public
    destructor Destroy; override;
  published
    property address: WideString read Faddress write Faddress;
    property birthDate: TXSDateTime read FbirthDate write FbirthDate;
    property fio: WideString read Ffio write Ffio;
    property insurance: WideString read Finsurance write Finsurance;
    property polis: WideString read Fpolis write Fpolis;
    property sex: WideString read Fsex write Fsex;
  end;


  // ************************************************************************ //
  // Namespace : http://webservice.interaction.medicalhistory.fors.ru/
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : LisServiceServiceSoapBinding
  // service   : LisService
  // port      : LisServicePort
  // URL       : http://fors-vyatka.ru:9900/interaction/lisService
  // ************************************************************************ //
  LisService = interface(IInvokable)
  ['{7979BD2C-7EAE-7E07-CD57-C56D346D7067}']
    function  getPatientInfo(const caseRecordNum: WideString): patientInformation; stdcall;
  end;

function GetLisService(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): LisService;


implementation

function GetLisService(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): LisService;
const
  defWSDL = 'C:\Users\&#213;&#224;&#235;&#232;&#235;\Desktop\&#202;&#232;&#240;&#238;&#226; &#206;&#202;&#193; &#203;&#200;&#209;-&#204;&#200;&#209;\lisService.xml';
  defURL  = 'http://fors-vyatka.ru:9900/interaction/lisService';
  defSvc  = 'LisService';
  defPrt  = 'LisServicePort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as LisService);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


destructor patientInformation.Destroy;
begin
  if Assigned(FbirthDate) then
    FbirthDate.Free;
  inherited Destroy;
end;

initialization

  InvRegistry.RegisterInterface(TypeInfo(LisService), 'http://webservice.interaction.medicalhistory.fors.ru/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(LisService), '');
  InvRegistry.RegisterInvokeOptions(TypeInfo(LisService), ioDocument);
  RemClassRegistry.RegisterXSClass(patientInformation, 'http://webservice.interaction.medicalhistory.fors.ru/', 'patientInformation');

end.
...
Рейтинг: 0 / 0
пространство имен в SOAP
    #37647072
vvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GodFather,

Ты на клиенте, при подключении хочешь изменить значение пространства имен?


Твой метод getPatientInfo() возвращает тип patientInformation, который регистрируется здесь:

RemClassRegistry.RegisterXSClass(patientInformation, 'http://webservice.interaction.medicalhistory.fors.ru/', 'patientInformation');


Тогда явно укажи значение во втором параметре, и все.
...
Рейтинг: 0 / 0
пространство имен в SOAP
    #37647080
Фотография GodFather
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvmGodFather,

Ты на клиенте, при подключении хочешь изменить значение пространства имен?


Твой метод getPatientInfo() возвращает тип patientInformation, который регистрируется здесь:

RemClassRegistry.RegisterXSClass(patientInformation, 'http://webservice.interaction.medicalhistory.fors.ru/', 'patientInformation');


Тогда явно укажи значение во втором параметре, и все.

Мне нужно не для возвращаемого значения, а для caseRecordNum:
Код: pascal
1.
2.
3.
4.
LisService = interface(IInvokable)
  ['{7979BD2C-7EAE-7E07-CD57-C56D346D7067}']
    function  getPatientInfo(const caseRecordNum: WideString): patientInformation; stdcall;
  end;



потому что на данный момент у меня вот так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <SOAP-ENV:Body>
- <getPatientInfo xmlns="http://webservice.interaction.medicalhistory.fors.ru/">
  <caseRecordNum>801949</caseRecordNum> 
  </getPatientInfo>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>



в данном случае caseRecordNum не наследует пространство имен из <getPatientInfo xmlns=" http://webservice.interaction.medicalhistory.fors.ru/">
...
Рейтинг: 0 / 0
пространство имен в SOAP
    #37647110
vvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GodFather, извинения, не то прочитал.
...
А разве должно быть явно задано какое-нибудь xmlns для типа WideString?

Значение свойства xmlns="" - это разве не то же самое, что и когда не задано?
...
Рейтинг: 0 / 0
пространство имен в SOAP
    #37647384
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvmЗначение свойства xmlns="" - это разве не то же самое, что и когда не задано?Нет. Когда пространство имен явно не указано, то узел находится в том же пространстве имен, что и родительский.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
пространство имен в SOAP
    #38712965
Здравстуйте, _Vasilisk_!
Столкнулся с такой же проблемой. Удалось ли решить ее без ручной обработки перед отправкой запроса? Буду признателен любой помощи.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
пространство имен в SOAP
    #39935232
pda0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Раз уж вопрос повторили пару лет спустя - отвечу, хоть прошло ещё шесть лет. Вдруг ещё кому пригодится.

Нет, вы никак не можете сделать это "красиво". Изучение исходников показало, что Delphi считает себя самой умной и если namespace передан пустым, то генерирует его вот таким. Никакие методы перекрыть невозможно, к сохранённым значениям не подобраться, они private, так что только вешать обработчики на THTTPRIO OnBeforeExecute и OnAfterExecute и править в них потоки с xml...
...
Рейтинг: 0 / 0
пространство имен в SOAP
    #39935240
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pda0
к сохранённым значениям не подобраться, они private

Если версия дельфей 2010 или свежее, то к приватным полям можно добраться через RTTI.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пространство имен в SOAP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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