Мыльный ответ не может быть проанализирован с SimpleXML - PullRequest
4 голосов
/ 14 февраля 2012

Я использую native soapclient () для вызова WSDL, но не могу использовать simplexml для анализа результата. Я постоянно получаю сообщение об ошибке:

Warning: simplexml_load_string() [function.simplexml-load-string]: 
Entity: line 1: parser error : Extra content at the end of the document

Это не похоже на проблему с пространством имен, и я уже пробовал патч, упомянутый в другом месте на сайте, чтобы удалить двоеточия из входной строки.

EDIT:

Спасибо, Гордон

Да, вы правы. Сервер является сайтом Microsoft, использующим наборы данных.

Если я объявлю мыльный клиент с трассировкой, установленной в 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 ]

1 голос
/ 20 марта 2015

У меня такая же проблема, тогда я пытаюсь:

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

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

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

И посмотрите результаты.

1 голос
/ 31 октября 2012

Вы можете попробовать DOMDocument вместо simpleXML, так как он казался немного более отказоустойчивым в моем прошлом использовании.Однако не так быстро.

Однако, когда мне нужно было проанализировать SOAP, я обратился к Как анализировать SOAP XML? и нашел отличную информацию о собственном PHP-клиенте PHP 5.

0 голосов
/ 09 августа 2016

Я также столкнулся с этой проблемой. После обращения к разработчику веб-службы я получил ответ, что это не XML, а DATATABLE (тип данных c #).

Наконец, мое решение состояло в том, чтобы создать собственный синтаксический анализатор вместо использования собственных PHP.

Попробуйте использовать explode () согласно соответствующим полям. Я знаю, что это не лучшее решение (определенно не лучшая практика), однако, если вы не можете получить его в другом формате, это может сработать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...