Как создать мыльный конверт вручную с помощью TXMLDocument (Delphi 2006)
У меня уже давно есть эта проблема, и я не могу решить ее самостоятельно. Я пробовал искать в Google, Bing и stackOverflow тоже? Неудачно...
Я пытаюсь создать мыльный заголовок вручную, используя компонент TXMLDocument в Delphi 2006:
..................
Что я делаю, так это то, что я создаю новый элемент под названием "мыло: конверт". В этом новом элементе я создаю три атрибута: xmlns: soap, xmlns: xsd и xmlns: xsi.
Когда я пытаюсь записать значение в любой из трех атрибутов, я получаю сообщение об ошибке ниже:
Попытка изменить узел только для чтения.
Кто-нибудь знает, как сделать эту задачу, используя TXMLDocument?
/Брайан
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
, это просто обертка компонента вокруг интерфейса.
Вот мое решение, оно использует 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;
На основе кода, приведенного в разделе Как установить префикс элемента документа в Delphi