Как построить мыльную конверт вручную с помощью txmldocument (Delphi 2006)
-
10-10-2019 - |
Вопрос
У меня уже давно эта проблема, и я не могу решить ее сами. Я тоже пытался искать Google, Bing и Stackoverflow? Неудачно...
Я пытаюсь построить заголовок мыла вручную, используя компонент TXMLDOCUMENT Delphi 2006:
... ... ... ... ... ...
Я делаю то, что я строю новый элемент под названием «Soap: Oenvelope». В этом новом элементе я создаю три атрибута под названием: «XMLNS: SOAP ',' xmlns: xsd 'и' xmlns: xsi '.
Когда я пытаюсь написать значение в любом из трех атрибутов, я получаю ошибку ниже:
Попытка изменить узел только для чтения.
Кто -нибудь знает, как выполнить эту задачу, используя txmldocument?
/Брайан
Решение
Здесь работает следующий код:
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