在Delphi中解析SOAP故障字符串

3

我正在尝试使用Delphi解析此类xml:

<?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 代码:

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.

我猜问题是:父节点"Fault"具有命名空间"http://schemas.xmlsoap.org/soap/envelope/"和前缀"soap",但是子节点"faultcode"没有命名空间和前缀。
如何获取到节点"faultcode"的接口?
谢谢。

1
XMLDoc should be declared as IXMLDocument - kobik
kobik,我尝试将声明更改为IXMLDocument,但它生成相同的错误。 - shurets
1
尝试使用 Root.ChildNodes.FindNode('faultcode').Text - kobik
谢谢,我找到了解决方案,我应该使用ChildNodes.FindNode('faultcode', '');其中第二个参数中的空字符串表示空命名空间。 - shurets
请将其作为答案。 - Jan Doggen
那好多了。谢谢。加入 XMLDoc.Options := XmlDoc.Options - [doNodeAutoCreate] 有所改善,是吧。 - David Heffernan
1个回答

2

这段代码正常运行:

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

第二个参数为空字符串代表没有命名空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接