分享
三行代码  ›  专栏  ›  技术社区  ›  Kurisu

需要从PHP中的curl xml响应中删除头 - Need to remove headers from cURL XML response in PHP

  •  0
  • Kurisu  · 技术社区  · 3 月前

    关于这方面有一些线索,但我在其中找不到解决这个问题的方法。我希望它不会违反重复规则。

    我已经用静态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 回复  |  直到 3 月前
        1
  •  1
  •   Nigel Ren    3 月前

    处理响应字符串的方式是一个坏主意,您应该坚持将内容作为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>';
            }
        }
    }
    
        2
  •  1
  •   Stephen Clouse    3 月前

    SOAP响应仍然是一个XML文档,因此使用它而不是与之抗争。把它当作一根绳子来对待绝对不好。

    据我所知,你正在努力 <cotizaction> 元素。在XML文档中查找元素很简单。读起来 XPath .

    $xml = simplexml_load_string(htmlspecialchars($reply));
    if ($xml) {
        foreach ($xml->xpath('//cotizacion') as $cotizacion) {
            // do your thing
        }
    }