XML WSDL, отображаемый с помощью ADOM XML v4 в Delphi XE2 - PullRequest
4 голосов
/ 25 сентября 2011

Я пытался реализовать очень простой веб-сервис, работающий под OSX (и windows) с XE2, но кажется, что XML, который ADOM XML v4 генерирует / отображает для веб-сервиса, в некотором смысле недопустим.

Единственное очевидное отличие, которое я заметил по сравнению с тем, что генерируется с помощью MSXML, заключается в том, что кодировка, похоже, установлена ​​на UTF-16LE независимо от того, что я пытаюсь изменить.

Кто-нибудь сталкивался с той же проблемой и знает, как ее исправить?

Обновление:

Самый простой способ воссоздать это - создать тривиальное «Серверное приложение SOAP» и изменить сгенерированный WebModuleUnit на следующее:

unit WebModuleUnit1;
interface
uses System.SysUtils, System.Classes, Web.HTTPApp, Soap.InvokeRegistry,
  Soap.WSDLIntf, System.TypInfo, Soap.WebServExp, Soap.WSDLBind, Xml.XMLSchema,
  Soap.WSDLPub, Soap.SOAPPasInv, Soap.SOAPHTTPPasInv, Soap.SOAPHTTPDisp,
  Soap.WebBrokerSOAP, Xml.xmldom, Xml.adomxmldom;

type
  TWebModule1 = class(TWebModule)
    HTTPSoapDispatcher1: THTTPSoapDispatcher;
    HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
    WSDLHTMLPublish1: TWSDLHTMLPublish;
    procedure WebModule1DefaultHandlerAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  WebModuleClass: TComponentClass = TWebModule1;

implementation
{$R *.dfm}

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;

initialization
DefaultDOMVendor := 'ADOM XML v4';
// DefaultDOMVendor := 'MSXML';
end.    

При использовании DOMVendor 'MSXML' служба работает, но при использовании ADOM XML v4 она взрывается.

Добавил это в QC, пожалуйста, проголосуйте за это, если вы считаете, что веб-сервисы на OSX важны. http://qc.embarcadero.com/wc/qcmain.aspx?d=99412

1 Ответ

1 голос
/ 25 сентября 2011

Вы можете попробовать активировать XMLDocument перед установкой его XML ...

Давайте покажем код, который я имею в виду:

procedure TForm1.btn2Click(Sender: TObject);
var
  s: string;
begin
  xmldoc1.Active := False;
  xmldoc1.XML.Text := '<root><child>value</child></root>';
  xmldoc1.Active := True;
  s := xmldoc1.XML.Text;
  ShowMessage(s);
end;

procedure TForm1.btn3Click(Sender: TObject);
var
  s: string;
begin
  xmldoc1.Active := False;
  xmldoc1.Active := True;
  xmldoc1.XML.Text := '<?xml version="1.0" encoding="UTF-8"?>' + sLineBreak + '<root><child>value</child></root>';
  s := xmldoc1.XML.Text;
  ShowMessage(s);
end;

С btn2Click, у меня есть: enter image description here С btn3Click, У меня есть: enter image description here

Поскольку я вижу спецификацию для первого, но не для второго, я думаю, что все в порядке ...

Если какая-либо вставка / обновление с узлом наTXMLDocument сбрасывает его на UTF-16LE , вы все равно можете заменить первую строку непосредственно перед экспортом XML:

procedure TForm1.btn2Click(Sender: TObject);
var
  s: string;
begin
  xmldoc1.Active := False;
  xmldoc1.XML.Text := '<root><child>value</child></root>';
  xmldoc1.Active := True;
  // do what you need

  //before getting the xml
  xmldoc1.XML[0] := '<?xml version="1.0" encoding="UTF-8"?>';
  s := xmldoc1.XML.Text;
  ShowMessage(s);
end;
...