我一直在尝试使用XE2在OSX(和 windows)下运行一个非常简单的Web服务,但似乎“ADOM XML v4”为Web服务生成/呈现的XML在某种程度上是无效的. 与“MSXML”生成的内容相比,我注意到的唯一明显区别
与“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
让我们展示我的意思代码:
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;