2016-12-14 2 views
3

Ich versuche, in Delphi xml wie folgt zu analysieren:Parse SOAP faultstring in Delphi

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <soap:Fault> 
     <faultcode>soap:Server</faultcode> 
     <faultstring>java.lang.ClassNotFoundException</faultstring> 
    </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

Delphi-Code:

program TestXML; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, 
    Xml.xmldom, 
    Xml.XMLIntf, 
    Xml.XMLDoc, 
    ActiveX; 

var 
    XMLDoc: TXMLDocument; 
    Root,Body,Fault,Node: IXMLNode; 

begin 
    CoInitialize(nil); 
    try 
    XMLDoc := TXMLDocument.Create(nil); 
    XMLDoc.Options := XmlDoc.Options - [doNodeAutoCreate]; 
    XMLDoc.LoadFromFile('test.xml'); 
    Root := XMLDoc.DocumentElement; 
    Body := Root.ChildNodes['Body']; 
    Writeln(Body.NodeName); 
    Fault := Body.ChildNodes['Fault']; 
    Writeln(Fault.NodeName); 
    try 
     Node := Fault.ChildNodes['faultcode']; 
     Writeln(Node.Text); 
    except 
     on E:exception do Writeln(E.Message); // "Node "faultcode not found". 
    end; 
    finally 
    CoUnInitialize; 
    end; 
end. 

ich das Problem erraten ist: der übergeordnete Knoten "Störung" hat die Namensraum "http://schemas.xmlsoap.org/soap/envelope/" und hat das Präfix "soap", aber der Kindknoten "faultcode" hat keinen Namensraum und kein Präfix.

Wie ist es möglich eine Schnittstelle zum Knoten "faultcode" zu bekommen?

Vielen Dank.

+1

'XMLDoc' sollte als' IXMLDocument' deklariert werden – kobik

+0

Kobik, ich habe versucht, die Deklaration in IXMLDocument zu ändern, aber es erzeugt den gleichen Fehler. – shurets

+1

versuchen Sie 'Root.ChildNodes.FindNode ('Fehlercode'). Text' – kobik

Antwort

2

Dieser Code funktioniert:

Fault.ChildNodes.FindNode('faultcode', ''); 

wo leere Zeichenkette im zweiten Parameter keinen Namensraum bedeutet.