4

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' を使用すると失敗します。

これを QC に追加しました。OSX 上の Web サービスが重要だと思われる場合は、投票してください。 http://qc.embarcadero.com/wc/qcmain.aspx?d=99412

4

1 に答える 1

1

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 の場合: ここに画像の説明を入力

1回目はBOMが見えて2回目は見えないので大丈夫だと思います...

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;
于 2011-09-24T23:40:13.883 に答える