2012-02-14 13 views
4

ネイティブsoapclient()を使用してWSDLを呼び出していますが、結果を解析するためにsimplexmlを使用することはできません。私は一貫してエラーを取得する:SimpleXMLでSOAP応答を解析できません

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

これは、名前空間の問題に似ていないと私はすでに入力された文字列からコロンを削除するには、サイト上の他の場所に言及したパッチを試してみました。

EDIT:

おかげで、ゴードン

はいあなたは正しいです。サーバーは、データセットを使用するMicrosoftサイトです。

私がtrueに設定されたトレースとSOAPクライアント宣言する場合:

$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に空のオブジェクトを取得する

+1

ルート要素がないようです – Gordon

答えて

1

をあなたは代わりのSimpleXMLののDOMDocumentを試してみてください私の過去の使用法ではtolerent。それほど速くはありません。

SOAPを解析する必要があるときには、私はHow to parse SOAP XML?と言い、PHP 5ネイティブSoapクライアントに関する優れた情報を見つけました。

1

私はその後、私がしようと、同じ問題を抱えている:

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

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

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

し、結果を参照してください。

0

この問題も発生します。 Webサービス開発者に連絡した後、私はこのレスポンスはXMLではなく、DATATABLE(c#データ型)という答えを得ました。

最後に私の解決策は、ネイティブのPHPを使うのではなく、自分のパーサーを作成することでした。

関連するフィールドに従ってexplode()を使用してみてください。 これは最高の解決策ではありません(間違いなくベストプラクティスではありません)。しかし、別の形式で入手できない場合は、これが効果的かもしれません。

関連する問題