Необходимо удалить заголовки из ответа CURL XML в PHP - PullRequest
1 голос
/ 04 мая 2019

Есть несколько тем об этом, но я не смог найти решение этой проблемы в них. Я надеюсь, что это не нарушает дублирующие правила.

Я тестировал следующий код со статическим XML, и он прекрасно работает, но сказал, что XML не содержит никаких заголовков.

Я пытаюсь удалить заголовки через код после выполнения запроса POST, чтобы я мог продолжить обработку полученного XML, но мне не повезло с этим.

Это XML:

<?xml version="1.0" encoding="utf-8"?><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><AUTOS_Cotizar_PHPResponse xmlns="http://tempuri.org/"><AUTOS_Cotizar_PHPResult><auto xmlns=""><operacion>1555843</operacion><statusSuccess>TRUE</statusSuccess><statusText></statusText><cotizacion><cobertura><codigo>A0</codigo><descripcion>RESPONSABILIDAD CIVIL SOLAMENTE</descripcion><premio>928,45</premio><cuotas>01</cuotas><impcuotas>928,45</impcuotas></cobertura></cotizacion><datos_cotiz><suma>477250</suma><uso>901</uso></datos_cotiz></auto></AUTOS_Cotizar_PHPResult></AUTOS_Cotizar_PHPResponse></soap:Body></soap:Envelope>

это код:

//converting raw cURL response to XML
$temp1 = htmlspecialchars ($reply); 
//replacing top headers
$temp2 = str_replace('<?xml version="1.0" encoding="utf-8"?><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><AUTOS_Cotizar_PHPResponse xmlns="http://tempuri.org/"><AUTOS_Cotizar_PHPResult>', "<<<'EOD'", $temp1);
//replacing closing header tags     
$temp3 = str_replace('</AUTOS_Cotizar_PHPResult></AUTOS_Cotizar_PHPResponse></soap:Body></soap:Envelope>', "EOD;", $temp2);
//this returns the original $temp1 without having anything replaced
echo $temp3;

//simplexml conversion
$xml = simplexml_load_string($temp3);

//running through the array and printing all values
if ($xml !== false) {
    foreach ($xml->cotizacion as $cotizacion) {
        foreach ($cotizacion->cobertura as $cobertura) {
            echo $cobertura->codigo;
            echo '<br>';
            echo $cobertura->descripcion;
            echo '<br>';
            echo $cobertura->premio;
            echo '<br>';
            echo $cobertura->cuotas;
            echo '<br>';
            echo $cobertura->impcuotas;
            echo '<br>';
        }
    }
}

Возможно, есть более эффективные способы сделать это, или, может быть, я делаю это неправильно. Я сейчас только учусь, так что не стесняйтесь поправлять меня, если хотите, я буду признателен!

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Ответ SOAP по-прежнему является документом XML, поэтому работайте с ним, а не с ним.Рассматривать его как строку определенно не очень хорошо.

Насколько я могу судить, вы пытаетесь работать со всеми элементами <cotizaction>.Найти элементы внутри документа XML просто.Читайте о XPath .

$xml = simplexml_load_string(htmlspecialchars($reply));
if ($xml) {
    foreach ($xml->xpath('//cotizacion') as $cotizacion) {
        // do your thing
    }
}
1 голос
/ 04 мая 2019

То, как вы обрабатываете строку ответа, является плохой идеей, вы должны придерживаться обработки содержимого в виде XML и работать с ним. Это использует XPath, чтобы найти начальную точку для обработки данных (что я не могу проверить с текущим образцом), но должно помочь с тем, что вам нужно сделать ...

// Load the original reply
$xml = simplexml_load_string($reply);

//running through the array and printing all values
if ($xml !== false) {
    // Find the <auto> element (use [0] as you want the first one)
    $auto = $xml->xpath("//auto")[0];

    // Loop through the cotizacion elements in the auto element
    foreach ($auto->cotizacion as $cotizacion) {
        foreach ($cotizacion->cobertura as $cobertura) {
            echo $cobertura->codigo;
            echo '<br>';
            echo $cobertura->descripcion;
            echo '<br>';
            echo $cobertura->premio;
            echo '<br>';
            echo $cobertura->cuotas;
            echo '<br>';
            echo $cobertura->impcuotas;
            echo '<br>';
        }
    }
}
...