Как создать мыльный конверт вручную с помощью TXMLDocument (Delphi 2006) - PullRequest
1 голос
/ 12 января 2011

У меня уже давно есть эта проблема, и я не могу решить ее самостоятельно. Я пробовал искать в Google, Bing и stackOverflow тоже? Не повезло ...

Я пытаюсь создать мыльный заголовок вручную, используя компонент TXMLDocument в Delphi 2006:

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

Что я делаю, так это то, что я создаю новый Элемент под названием «мыло: Конверт». В этом новом элементе я создаю три атрибута: xmlns: soap, xmlns: xsd и xmlns: xsi.

Когда я пытаюсь написать значение в любом из трех атрибутов, я получаю сообщение об ошибке ниже:

Попытка изменить узел только для чтения.

Кто-нибудь знает, как выполнить эту задачу, используя TXMLDocument?

/ Brian

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Вот мое решение, оно использует 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

2 голосов
/ 12 января 2011

Следующий код отлично работает здесь:

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, это просто оболочка для компонента вокруг интерфейса.

...