1

私は長い間この問題を抱えていて、自分で解決することはできません。Google、Bing、stackOverflowも検索してみましたか?運がない...

Delphi 2006のTXMLDocumentコンポーネントを使用して、soapヘッダーを手動で作成しようとしています。

... ... ... ........。

私がしているのは、「soap:Envelope」という新しい要素を作成しているということです。この新しい要素では、「xmlns:soap」、「xmlns:xsd」、「xmlns:xsi」という3つの属性を作成しています。

3つの属性のいずれかに値を書き込もうとすると、次のエラーが発生します。

読み取り専用ノードを変更してみてください。

TXMLDocumentを使用してこのタスクを実行する方法を知っている人はいますか?

/ブライアン

4

2 に答える 2

3

次のコードはここで正常に機能します。

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。これは、インターフェイスの単なるコンポーネントラッパーです。

于 2011-01-12T14:14:29.770 に答える
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;

Delphiでドキュメント要素のプレフィックスを設定する方法で提供されているコードに基づく

于 2011-01-12T15:05:11.727 に答える