我已经有很长一段时间没遇到这个问题了,我无法解决这个问题。我也试过搜索Google,Bing和stackOverflow吗?没有运气......
我正在尝试使用Delphi 2006的TXMLDocument组件手动构建soap标头:
... ... ... ... ... ...
我正在做的是我正在构建一个名为'soap:Envelope'的新元素。在这个新元素中,我创建了三个名为:'xmlns:soap','xmlns:xsd'和'xmlns:xsi'。
当我尝试在三个属性中的任何一个中写入值时,我收到以下错误:
尝试修改只读节点。
是否有人知道如何使用TXMLDocument执行此任务?
/布赖恩
答案 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;
中提供的代码