加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi XE2中由’ADOM XML v4’呈现的WSDL XML

发布时间:2020-12-15 09:11:52 所属栏目:大数据 来源:网络整理
导读:我一直在尝试使用XE2在OSX(和 windows)下运行一个非常简单的Web服务,但似乎“ADOM XML v4”为Web服务生成/呈现的XML在某种程度上是无效的. 与“MSXML”生成的内容相比,我注意到的唯一明显区别是,无论我尝试更改什么,编码似乎都设置为“UTF-16LE”. 任何人遇
我一直在尝试使用XE2在OSX(和 windows)下运行一个非常简单的Web服务,但似乎“ADOM XML v4”为Web服务生成/呈现的XML在某种程度上是无效的.

与“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’它会爆炸.

如果您认为OSX上的Web服务很重要,请将其添加到QC中.
http://qc.embarcadero.com/wc/qcmain.aspx?d=99412

解决方法

您可以在设置XML之前尝试激活XMLDocument …

让我们展示我的意思代码:

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,我有:

使用btn3Click,我有:

正如我看到的第一个BOM,但不是第二个,我认为没关系……

如果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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读