2011-01-12 18 views
1

Ich habe dieses Problem seit langer Zeit und ich kann es nicht selbst lösen. Ich habe versucht, Google, Bing und stackOverflow zu suchen? Kein Glück ...So erstellen Sie einen Soap-Umschlag manuell mit TXMLDocument (Delphi 2006)

Ich versuche, einen SOAP-Header zu konstruieren manuell die TXMLDocument Komponente von Delphi 2006 mit:

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

Was ich tue, ist, dass ich ein neues Element namens bin konstruieren 'soap: Envelope'. In diesem neuen Element erstelle ich drei Attribute namens 'xmlns: soap', 'xmlns: xsd' und 'xmlns: xsi'.

Wenn ich versuche, einen Wert in jedem der drei Attribute schreiben dann unter ich den Fehler bekommen:

Versuch, einen Nur-Lese-Knoten zu ändern.

Kennt jemand diese Aufgabe mit dem TXMLDocument?

/Brian

+0

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

Antwort

2

Der folgende Code funktioniert hier:

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; 

Sie sollten in der Lage TXMLDocument statt IXMLDocument zu verwenden, ist es nur eine Komponente Wrapper um die Schnittstelle.

+0

Wow. Das funktioniert. Ich danke dir sehr!!! Ich habe versucht, den Wert mit der Eigenschaft NodeValue: = ....; Ich verwendete die folgende Semantik (sehr einfach): MyNode: = Document.CreateNode (....); MyNode.NodeValue: = ....;/Brian –

2

Hier ist meine Lösung, es DeclareNamespace verwendet Namespaces zu deklarieren:

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; 

Basierend auf den Code in How to set the prefix of a document element in Delphi

+0

Danke auch für diese Lösung. Ich liebe euch (o; Danke. Danke. Danke !!! –

+0

Da es sich nur um die Kopfzeile handelte habe ich mich nicht darum gekümmert Namespaces zu setzen, aber deine Lösung ist natürlich ein bisschen sauberer. –