php – 无法使用SimpleXML解析Soap响应
发布时间:2020-12-13 16:15:01 所属栏目:PHP教程 来源:网络整理
导读:我正在使用本机soapclient()来调用WSDL但我不能使用simplexml来解析结果.我一直都会收到错误: Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Extra content at the end of the document 这看起来不
我正在使用本机soapclient()来调用WSDL但我不能使用simplexml来解析结果.我一直都会收到错误:
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Extra content at the end of the document 这看起来不像命名空间问题,我已经尝试过网站上其他地方提到的补丁来从输入字符串中删除冒号. 编辑: 谢谢,戈登 你是对的.该服务器是使用数据集的Microsoft站点. 如果我将soap客户端声明为trace设置为true: $soapClient = new soapclient($this->wsdlUrl,array('trace'=>true)); 然后从响应中检索原始XML: $soapResult = $soapClient->GetScheduledSectors(); $responseXml = $soapClient->__getLastResponse(); $xml = simplexml_load_string($responseXml,NULL,"http://schemas.xmlsoap.org/soap/envelope/"); 然后我得到: SimpleXMLElement Object ( [Body] => SimpleXMLElement Object ( ) ) 响应XML标头和第一个标签如下所示: <?xml version='1.0'?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetScheduledSectorsResponse xmlns="https://www.kulula.com/k3api/"> <GetScheduledSectorsResult msdata:SchemaSerializationMode="ExcludeSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:schema id="dsFlight" targetNamespace="http://tempuri.org/dsFlight.xsd" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:mstns="http://tempuri.org/dsFlight.xsd" xmlns="http://tempuri.org/dsFlight.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"> <xs:element name="dsFlight" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:ExecutionTime="1140"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"/> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <dsFlight xmlns="http://tempuri.org/dsFlight.xsd"> <FlightSector diffgr:id="FlightSector1" msdata:rowOrder="0"> <FlightSectorId>1</FlightSectorId> <FlightSectorName>JNBCPT</FlightSectorName> <FromAirport>O.R. Tambo (Jo'burg)</FromAirport> <ToAirport>Cape Town</ToAirport> <DepartureAirportId>1</DepartureAirportId> <ArrivalAirportId>2</ArrivalAirportId> <AirlineCode>BA</AirlineCode> <Ordernumber>100</Ordernumber> <FlightZoneId>1</FlightZoneId> <DepartureCountryCode>ZA</DepartureCountryCode> <DepartureContinentCode>AF</DepartureContinentCode> </FlightSector> 我还尝试注册以下命名空间: $xml = simplexml_load_string($this->responseXml,"http://schemas.xmlsoap.org/soap/envelope/"); $xml->registerXPathNamespace('soap','http://schemas.xmlsoap.org/soap/envelope/'); $xml->registerXPathNamespace('xsi','http://www.w3.org/2001/XMLSchema-instance'); $xml->registerXPathNamespace('xsd','http://www.w3.org/2001/XMLSchema'); $xml->registerXPathNamespace('diffgr','urn:schemas-microsoft-com:xml-diffgram-v1'); $xml->registerXPathNamespace('mstns','http://tempuri.org/dsFlight.xsd'); $xml->registerXPathNamespace('msprop','urn:schemas-microsoft-com:xml-msprop'); 但仍然在$xml中获得一个空对象 解决方法
您可以尝试使用DOMDocument而不是simpleXML,因为它在我过去的使用中似乎有点容错.虽然不是那么快.
然而,当我需要解析SOAP时,我重新考虑了How to parse SOAP XML?,并在PHP 5本机Soap客户端上找到了很好的信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |