【发布时间】:2016-12-14 11:00:33
【问题描述】:
我正在尝试像这样在 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>
德尔福代码:
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”没有命名空间也没有前缀。
如何获得节点“故障代码”的接口?
谢谢。
【问题讨论】:
-
XMLDoc应声明为IXMLDocument -
kobik,我尝试将声明更改为 IXMLDocument,但它会产生相同的错误。
-
试试
Root.ChildNodes.FindNode('faultcode').Text -
谢谢,我找到了解决方案,我应该使用 ChildNodes.FindNode('faultcode', '');其中第二个参数中的空字符串表示空命名空间。
-
请回答