xml - Delphi XE2 中 'ADOM XML v4' 呈现的 WSDL XML

标签 xml macos web-services delphi delphi-xe2

我一直在尝试使用 XE2 实现一个在 OSX(和 Windows)下运行的非常简单的网络服务,但似乎“ADOM XML v4”为网络服务生成/呈现的 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' 它会崩溃。

将此添加到 QC 如果您觉得 OSX 上的 Web 服务很重要,请投票支持它。 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,我有: enter image description here 使用 btn3Click,我有: enter image description here

因为我看到了第一个的 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;

关于xml - Delphi XE2 中 'ADOM XML v4' 呈现的 WSDL XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7542148/

相关文章:

java - 为什么在解码期间不使用 ObjectFactory?

php - 创建 URL 字符串时 XML 中的 & 符号问题

php - 在 Mac OS X Lion (10.7) 上重写 Apache2 中的相对路径

javascript - ScriptManager使用AJAX从WebService异步获取数据并抛出错误?

java - 错误 :org. ksoap2.SoapFault 服务类对象没有实现需要的方法

c# - 解析 xml 并连接多个子节点的结果

c# - 向现有 XML 文件中的多个节点添加新元素

macos - 访问cocoa中父类的对象

vim 中的 JavaScript 配色方案?

java - 是否可以在没有服务代理的情况下构建 SOA?这方面有什么好的例子吗?