Как решить этот прочитанный ответ XML с помощью PHP - PullRequest
0 голосов
/ 12 марта 2019

Я создаю веб-сайт.На этом веб-сайте я использую запрос SOAP, чтобы получить ответ.Прежде всего я использовал cURL для отправки запроса, и я получил ответ.Но когда я пытался напечатать XML-ответ print_r, он дает мне следующее -

SimpleXMLElement Object ()

По сути, я хочу прочитать этиXML построчно, как я хочу.Допустим, я хочу получить ConversionId.

Итак, как я могу это сделать ??

Вот функция, которую я использовал для отправки запроса SOAP.

public function authticate(){

$url = 'https://webservices.havail.sabre.com';
        $tokengenheaders = array(
            'Content-Type: text/xml'
        );

        $AuthData = '<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
   <soap-env:Header>
      <eb:MessageHeader soap-env:mustUnderstand="1" eb:version="1.0">
         <eb:From>
            <eb:PartyId />
         </eb:From>
         <eb:To>
            <eb:PartyId />
         </eb:To>
         <eb:CPAId>ID45</eb:CPAId>
         <eb:ConversationId>IdOfConversion</eb:ConversationId>
         <eb:Service>SessionCreate</eb:Service>
         <eb:Action>SessionCreate</eb:Action>
         <eb:MessageData>
            <eb:MessageId>MsgId</eb:MessageId>
            <eb:Timestamp>2017-11-27T09:58:31Z</eb:Timestamp>
         </eb:MessageData>
      </eb:MessageHeader>
      <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/12/utility">
         <wsse:UsernameToken>
            <wsse:Username>Kist</wsse:Username>
            <wsse:Password>Kistlak</wsse:Password>
            <Organization>FSG</Organization>
            <Domain>SN</Domain>
         </wsse:UsernameToken>
      </wsse:Security>
   </soap-env:Header>
   <soap-env:Body>
      <eb:Manifest soap-env:mustUnderstand="1" eb:version="1.0">
         <eb:Reference xlink:href="cid:rootelement" xlink:type="simple" />
      </eb:Manifest>
      <SessionCreateRQ>
         <POS>
            <Source PseudoCityCode="5H7D" />
         </POS>
      </SessionCreateRQ>
      <ns:SessionCreateRQ xmlns:ns="http://www.opentravel.org/OTA/2002/11" />
   </soap-env:Body>
</soap-env:Envelope>';

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://webservices.sabre.com");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $AuthData); // the SOAP request
        curl_setopt($ch, CURLOPT_HTTPHEADER, $tokengenheaders);
        curl_setopt($ch, CURLOPT_VERBOSE, false);
        $soaptoken = curl_exec($ch);
        curl_close($ch);

        //$xmlElement = new SimpleXMLElement($soaptoken, LIBXML_NOCDATA);

        $xml = simplexml_load_string($soaptoken);
        print_r ($xml) ; die();

        return $soaptoken;

    }

Вот ответ XML.

<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope
    xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Header>
        <eb:MessageHeader
            xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" eb:version="1.0" soap-env:mustUnderstand="1">
            <eb:From>
                <eb:PartyId eb:type="URI"/>
            </eb:From>
            <eb:To>
                <eb:PartyId eb:type="URI"/>
            </eb:To>
            <eb:CPAId>Id234</eb:CPAId>
            <eb:ConversationId>ConversionId</eb:ConversationId>
            <eb:Service eb:type="sabreXML">Session</eb:Service>
            <eb:Action>SessionCreateRS</eb:Action>
            <eb:MessageData>
                <eb:MessageId>MsgId</eb:MessageId>
                <eb:Timestamp>2019-03-11T09:27:32</eb:Timestamp>
                <eb:RefToMessageId>MsgRef</eb:RefToMessageId>
            </eb:MessageData>
        </eb:MessageHeader>
        <wsse:Security
            xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
            <wsse:BinarySecurityToken valueType="String" EncodingType="wsse:Base64Binary">SecToken</wsse:BinarySecurityToken>
        </wsse:Security>
    </soap-env:Header>
    <soap-env:Body>
        <SessionCreateRS
            xmlns="http://www.opentravel.org/OTA/2002/11" version="1" status="Approved">\t
            <ConversationId>ConversionId</ConversationId>
        </SessionCreateRS>
    </soap-env:Body>
</soap-env:Envelope>

Ответ массива PHP.

[soap-env_Body] => Array
        (
            [stl19_GetReservationRS] => Array
                (
                    [@attributes] => Array
                        (
                            [Version] => 1.19.0
                        )

                    [stl19_Reservation] => Array
                        (
                            [@attributes] => Array
                                (
                                    [numberInParty] => 3
                                    [numberOfInfants] => 1
                                    [NumberInSegment] => 2
                                )

                            [stl19_BookingDetails] => Array
                                (
                                    [stl19_RecordLocator] => XWYBFF
                                    [stl19_CreationTimestamp] => 2019-03-05T02:22:00
                                    [stl19_SystemCreationTimestamp] => 2019-03-05T02:22:00
                                    [stl19_CreationAgentID] => AWS
                                    [stl19_UpdateTimestamp] => 2019-03-05T02:22:06
                                    [stl19_PNRSequence] => 2
                                    [stl19_DivideSplitDetails] => Array
                                        (
                                        )

                                    [stl19_EstimatedPurgeTimestamp] => 2019-08-12T00:00:00
                                    [stl19_UpdateToken] => 3ea61cc7bab6c025877a7014fd52e44ca4a778bc80edab34
                                )

                            [stl19_POS] => Array
                                (
                                    [@attributes] => Array
                                        (
                                            [AirExtras] => false
                                            [InhibitCode] => U
                                        )

                                    [stl19_Source] => Array
                                        (
                                            [@attributes] => Array
                                                (
                                                    [BookingSource] => 5H7D
                                                    [AgentSine] => AWS
                                                    [PseudoCityCode] => 5H7D
                                                    [ISOCountry] => LK
                                                    [AgentDutyCode] => *
                                                    [AirlineVendorID] => AA
                                                    [HomePseudoCityCode] => 5H7D
                                                    [PrimeHostID] => 1B
                                                )

                                        )

                                )

                            [stl19_PassengerReservation] => Array
                                (
                                    [stl19_Passengers] => Array
                                        (
                                        )

                                    [stl19_Segments] => Array
                                        (
                                        )

                                    [stl19_TicketingInfo] => Array
                                        (
                                        )

                                    [stl19_ItineraryPricing] => Array
                                        (
                                        )

                                )

                            [stl19_ReceivedFrom] => Array
                                (
                                )

                            [stl19_EmailAddresses] => Array
                                (
                                )

                        )

                    [or114_PriceQuote] => Array
                        (
                            [PriceQuoteInfo] => Array
                                (
                                    [Reservation] => Array
                                        (
                                            [@attributes] => Array
                                                (
                                                    [updateToken] => eNc:::h3/WwF9UlK9QLSrRp5hEXg==
                                                )

                                        )

                                    [Summary] => Array
                                        (
                                            [NameAssociation] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [firstName] => RANGA MR
                                                                    [lastName] => DASANAYAKA
                                                                    [nameId] => 1
                                                                    [nameNumber] => 1.1
                                                                )

                                                            [PriceQuote] => Array
                                                                (
                                                                    [@attributes] => Array
                                                                        (
                                                                            [latestPQFlag] => true
                                                                            [number] => 1
                                                                            [pricingStatus] => AUTOPRICED
                                                                            [pricingType] => S
                                                                            [status] => A
                                                                            [type] => PQ
                                                                        )

                                                                    [Indicators] => Array
                                                                        (
                                                                            [@attributes] => Array
                                                                                (
                                                                                    [isExpired] => true
                                                                                )

                                                                        )

                                                                    [Passenger] => Array
                                                                        (
                                                                            [@attributes] => Array
                                                                                (
                                                                                    [passengerTypeCount] => 1
                                                                                    [requestedType] => ADT
                                                                                    [type] => ADT
                                                                                )

                                                                        )

                                                                    [ItineraryType] => I
                                                                    [ValidatingCarrier] => AI
                                                                    [Amounts] => Array
                                                                        (
                                                                            [Total] => 25395
                                                                        )

                                                                    [LocalCreateDateTime] => 2019-03-05T13:52:00
                                                                )

                                                        )

                                                    [1] => Array
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [firstName] => IRUSHA MSTR
                                                                    [lastName] => HASANTHA
                                                                    [nameId] => 2
                                                                    [nameNumber] => 2.1
                                                                )

                                                            [PriceQuote] => Array
                                                                (
                                                                    [@attributes] => Array
                                                                        (
                                                                            [latestPQFlag] => true
                                                                            [number] => 2
                                                                            [pricingStatus] => AUTOPRICED
                                                                            [pricingType] => S
                                                                            [status] => A
                                                                            [type] => PQ
                                                                        )

                                                                    [Indicators] => Array
                                                                        (
                                                                            [@attributes] => Array
                                                                                (
                                                                                    [isExpired] => true
                                                                                )

                                                                        )

                                                                    [Passenger] => Array
                                                                        (
                                                                            [@attributes] => Array
                                                                                (
                                                                                    [passengerTypeCount] => 1
                                                                                    [requestedType] => CNN
                                                                                    [type] => CNN
                                                                                )

                                                                        )

                                                                    [ItineraryType] => I
                                                                    [TicketDesignator] => CH25
                                                                    [ValidatingCarrier] => AI
                                                                    [Amounts] => Array
                                                                        (
                                                                            [Total] => 21695
                                                                        )

                                                                    [LocalCreateDateTime] => 2019-03-05T13:52:00
                                                                )

                                                        )

                                                    [2] => Array
                                                        (
                                                            [@attributes] => Array
                                                                (
                                                                    [firstName] => KISALKA MSTR
                                                                    [lastName] => I/1RAJAPAKSE
                                                                    [nameId] => 3
                                                                    [nameNumber] => 3.1
                                                                )

                                                            [PriceQuote] => Array
                                                                (
                                                                    [@attributes] => Array
                                                                        (
                                                                            [latestPQFlag] => true
                                                                            [number] => 3
                                                                            [pricingStatus] => AUTOPRICED
                                                                            [pricingType] => S
                                                                            [status] => A
                                                                            [type] => PQ
                                                                        )

                                                                    [Indicators] => Array
                                                                        (
                                                                            [@attributes] => Array
                                                                                (
                                                                                    [isExpired] => true
                                                                                )

                                                                        )

                                                                    [Passenger] => Array
                                                                        (
                                                                            [@attributes] => Array
                                                                                (
                                                                                    [passengerTypeCount] => 1
                                                                                    [requestedType] => INF
                                                                                    [type] => INF
                                                                                )

                                                                        )

                                                                    [ItineraryType] => I
                                                                    [TicketDesignator] => IN90
                                                                    [ValidatingCarrier] => AI
                                                                    [Amounts] => Array
                                                                        (
                                                                            [Total] => 2008
                                                                        )

                                                                    [LocalCreateDateTime] => 2019-03-05T13:52:00
                                                                )

                                                        )

                                                )

                                        )

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Оказывается, ответы SOAP не так дружелюбны, как XML. Вам нужно будет немного поработать, чтобы достичь того, чего вы хотите достичь:

/**
 * FUNCTION TO MUNG THE XML SO WE DO NOT HAVE TO DEAL WITH NAMESPACE
 * @link https://stackoverflow.com/a/42311833/429071
 */
function mungXML($xml)
{
    $obj = SimpleXML_Load_String($xml);
    if ($obj === FALSE) return $xml;

    // GET NAMESPACES, IF ANY
    $nss = $obj->getNamespaces(TRUE);
    if (empty($nss)) return $xml;

    // CHANGE ns: INTO ns_
    $nsm = array_keys($nss);
    foreach ($nsm as $key)
    {
        // A REGULAR EXPRESSION TO MUNG THE XML
        $rgx
        = '#'               // REGEX DELIMITER
        . '('               // GROUP PATTERN 1
        . '\<'              // LOCATE A LEFT WICKET
        . '/?'              // MAYBE FOLLOWED BY A SLASH
        . preg_quote($key)  // THE NAMESPACE
        . ')'               // END GROUP PATTERN
        . '('               // GROUP PATTERN 2
        . ':{1}'            // A COLON (EXACTLY ONE)
        . ')'               // END GROUP PATTERN
        . '#'               // REGEX DELIMITER
        ;
        // INSERT THE UNDERSCORE INTO THE TAG NAME
        $rep
        = '$1'          // BACKREFERENCE TO GROUP 1
        . '_'           // LITERAL UNDERSCORE IN PLACE OF GROUP 2
        ;
        // PERFORM THE REPLACEMENT
        $xml =  preg_replace($rgx, $rep, $xml);
    }
    return $xml;
}

Тогда, наконец, мы можем запустить это, и мы золотой:

$plainXML = mungXML($soaptoken);
$jsonResult = json_encode(SimpleXML_Load_String($plainXML, 'SimpleXMLElement', LIBXML_NOCDATA));
$arrayResult = json_decode($jsonResult , true);
print_r($arrayResult);

Это было заимствовано из очень похожего вопроса: Как преобразовать SOAP-ответ в PHP-массив?

1 голос
/ 12 марта 2019

Существуют определенные библиотеки SOAP для PHP (хотя я их не использовал), которые могут быть лучшим путем, но в вашем примере вы можете получить контент (я предполагаю, что это тело, а не содержимое заголовка), используяXPath, чтобы найти тег body, а затем просто использовать иерархию XML, как если бы это был синтаксис объекта ...

$body = $xmlElement->xpath("//soap-env:Body");
if ( count($body) > 0 ) {
    echo $body[0]->SessionCreateRS->ConversationId;
}

[0] потому что xpath() возвращает список соответствующих узлов, и выдолжен иметь только один - так что он просто выбирает первый.Вы могли бы что-то сделать, если ничего не найдено, но ваше приложение решает, нужно ли и что делать.

Чтобы получить доступ к элементу wsse:BinarySecurityToken, так как он имеет пространство имен, вы должны зарегистрировать его вдокумент, чтобы иметь возможность использовать его в выражении XPath, но затем вы можете использовать полное имя, чтобы найти это ...

$xmlElement->registerXPathNamespace("wsse", "http://schemas.xmlsoap.org/ws/2002/12/secext");
$bst = $xmlElement->xpath("//wsse:BinarySecurityToken");
if ( count($bst) > 0 ) {
    echo $bst[0];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...