由';ADOM XML v4';在Delphi XE2中
我一直在尝试用XE2实现一个在OSX(和windows)下运行的非常简单的Web服务,但是“ADOM XML v4”为Web服务生成/呈现的XML在某种程度上是无效的 与“MSXML”生成的内容相比,我注意到的唯一明显区别是,无论我尝试更改什么,编码似乎都设置为“UTF-16LE” 有人遇到同样的问题,知道如何解决吗 更新: 最简单的方法是创建一个简单的“SOAP服务器应用程序”,并将生成的WebModuleUnit更改为以下内容:由';ADOM XML v4';在Delphi XE2中,xml,macos,web-services,delphi,delphi-xe2,Xml,Macos,Web Services,Delphi,Delphi Xe2,我一直在尝试用XE2实现一个在OSX(和windows)下运行的非常简单的Web服务,但是“ADOM XML v4”为Web服务生成/呈现的XML在某种程度上是无效的 与“MSXML”生成的内容相比,我注意到的唯一明显区别是,无论我尝试更改什么,编码似乎都设置为“UTF-16LE” 有人遇到同样的问题,知道如何解决吗 更新: 最简单的方法是创建一个简单的“SOAP服务器应用程序”,并将生成的WebModuleUnit更改为以下内容: unit WebModuleUnit1; interface
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”服务可以正常工作,但使用“ADOMXMLV4”服务会崩溃
如果你觉得OSX上的Web服务很重要,请投票支持。
您可以在设置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;
程序TForm1.btn2Click(发送方:TObject);
变量
s:字符串;
开始
xmldoc1.Active:=False;
xmldoc1.XML.Text:=“值”;
xmldoc1.Active:=True;
s:=xmldoc1.XML.Text;
显示讯息;
结束;
程序TForm1.btn3Click(发送方:TObject);
变量
s:字符串;
开始
xmldoc1.Active:=False;
xmldoc1.Active:=True;
xmldoc1.XML.Text:=''+sLineBreak+'value';
s:=xmldoc1.XML.Text;
显示讯息;
结束;
通过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;
程序TForm1.btn2Click(发送方:TObject);
变量
s:字符串;
开始
xmldoc1.Active:=False;
xmldoc1.XML.Text:=“值”;
xmldoc1.Active:=True;
//做你需要的
//在获取xml之前
XML[0]:='';
s:=xmldoc1.XML.Text;
显示讯息;
结束;
我一开始确实尝试过,更改了?xml行,但没有用。由于XML是由webservice组件“幕后”生成的,所以我只有几个地方可以挂接。最好是让ADOM生成正确的XML。请注意,这样您就不能再访问qc.embarcadero.com
链接了。如果您需要访问旧的QC数据,请查看。