如何使用TXMLDocument手动构建Soap信封(Delphi 2006)

时间:2011-01-12 09:27:17

标签: xml delphi delphi-2006 txmldocument

我已经有很长一段时间没遇到这个问题了,我无法解决这个问题。我也试过搜索Google,Bing和stackOverflow吗?没有运气......

我正在尝试使用Delphi 2006的TXMLDocument组件手动构建soap标头:

   ... ... ...       ... ... ...   

我正在做的是我正在构建一个名为'soap:Envelope'的新元素。在这个新元素中,我创建了三个名为:'xmlns:soap','xmlns:xsd'和'xmlns:xsi'。

当我尝试在三个属性中的任何一个中写入值时,我收到以下错误:

尝试修改只读节点。

是否有人知道如何使用TXMLDocument执行此任务?

/布赖恩

2 个答案:

答案 0 :(得分:2)

以下代码在这里工作正常:

procedure WriteSoapFile;
var
  Document: IXMLDocument;
  Envelope: IXMLNode;
  Body: IXMLNode;
begin
  Document := NewXMLDocument;
  Envelope := Document.AddChild('soap:Envelope');
  Envelope.Attributes['xmlns:soap'] := 'schemas.xmlsoap.org/soap/envelope/';
  Envelope.Attributes['xmlns:xsd']  := 'w3.org/2001/XMLSchema';
  Envelope.Attributes['xmlns:xsi']  := 'w3.org/2001/XMLSchema-instance';
  Body := Envelope.AddChild('soap:Body');
  Document.SaveToFile('Test.xml');
end;

您应该能够使用TXMLDocument而不是IXMLDocument,它只是界面的组件包装。

答案 1 :(得分:2)

这是我的解决方案,它使用DeclareNamespace来声明名称空间:

procedure WriteSoapFile;
const
  NS_SOAP = 'schemas.xmlsoap.org/soap/envelope/';
var
  Document: IXMLDocument;
  Envelope: IXMLNode;
  Body: IXMLNode;
begin
  Document := NewXMLDocument;
  Envelope := Document.CreateElement('soap:Envelope', NS_SOAP);
  Envelope.DeclareNamespace('soap', NS_SOAP);
  Envelope.DeclareNamespace('xsd', 'w3.org/2001/XMLSchema');
  Envelope.DeclareNamespace('xsi', 'w3.org/2001/XMLSchema-instance');
  Body := Envelope.AddChild('Body');
  Document.DocumentElement := Envelope;
  Document.SaveToFile('Test.xml');
end;

基于How to set the prefix of a document element in Delphi

中提供的代码