使用SimpleXML无法解析Soap响应

时间:2012-02-14 09:58:43

标签: php soap

我正在使用本机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, 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, NULL, NULL, "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中获得一个空对象

3 个答案:

答案 0 :(得分:1)

您可能会尝试使用DOMDocument而不是simpleXML,因为在我过去的使用中它似乎有点容错。虽然不是那么快。

然而,当我需要解析SOAP时,我对How to parse SOAP XML?进行了改进,并在PHP 5本机Soap客户端上找到了很好的信息。

答案 1 :(得分:1)

我有同样的问题,然后我尝试:

$soapResult = $soapClient->GetScheduledSectors();
$responseXml = $soapClient->__getLastResponse();

$dom = new DomDocument();
$dom->loadXML($responseXml );

$phpObject = simplexml_load_string($dom->textContent);
print_r($phpObject ); 

看结果。

答案 2 :(得分:0)

我也遇到过这个问题。 在联系Web服务开发人员之后,我得到的答案是这个响应不是XML,而是DATATABLE(这是一个c#数据类型)。

最后,我的解决方案是创建自己的解析器,而不是使用本机PHP。

根据相关字段尝试使用explode()。 我知道这不是最好的解决方案(绝对不是最佳做法),但是如果你不能以其他格式获得它,这可能适合你。