解析来自 SOAP 的卷曲响应

Parse curl response from SOAP

我使用 php curl 成功地从 soap 网络服务获得响应。我想知道如何解析 curl 响应,以便我分别获得每个值以保存到数据库中。

我的代码:

    $curl = curl_init();
    curl_setopt_array($curl, array(
    CURLOPT_URL => "http://xxxxxx/WSAutorizaciones/WSAutorizacionLaboratorio.asmx?WSDL",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => 
    '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
    <AuthenticationHeader xmlns="https://arssenasa.gob.do/">
    <Cedula>001-0946651-5</Cedula>
    <Password>xxxxxxx</Password>
    <Proveedo>12077</Proveedo>
    </AuthenticationHeader>
    </soap:Header>
    <soap:Body>
    <ConsultarAfiliado xmlns="https://arssenasa.gob.do/">
    <TipoDocumento>2</TipoDocumento>
    <NumDocumento>021827151</NumDocumento>
    </ConsultarAfiliado>
    </soap:Body>
    </soap:Envelope>',
    CURLOPT_HTTPHEADER => array("content-type: text/xml"),
    ))
    ;

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
    echo "cURL Error #:" . $err;
    } else {
    echo $response;
    }

结果显示如下:

8013-0000655-6021827151MARGARET ADIRASANTANA LORENZO DE CABRAL08CONTRIBUTIVO22/11/197346FEMENINO08

肥皂反应是这样的:

    <?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>
    <ConsultarAfiliadoResponse xmlns="https://arssenasa.gob.do/">
    <ConsultarAfiliadoResult>
    <Contrato>8</Contrato>
    <Cedula>013-0000655-6</Cedula>
    <Nss>021827151</Nss>
    <Nombres>MARGARET ADIRA</Nombres>
    <Apellidos>SANTANA LORENZO DE CABRAL</Apellidos>
    <IdEstado>0</IdEstado>
    <CodigoFamiliar>8</CodigoFamiliar>
    <IdRegimen xsi:nil="true" />
    <Regimen>CONTRIBUTIVO</Regimen>
    <FechaNacimiento>22/11/1973</FechaNacimiento>
    <Edad>46</Edad>
    <Sexo>FEMENINO</Sexo>
    <TipoDocumento>0</TipoDocumento>
    <CodigoAfiliado>8</CodigoAfiliado>
    <MensajeAfiliado />
    </ConsultarAfiliadoResult>
    </ConsultarAfiliadoResponse>
    </soap:Body>
    </soap:Envelope>

这是一个可能的示例,说明如何使用 SimpleXML 从 SOAP 响应(下方)中获取 XML 元素,它可能包含在 PHP 安装中。因为我不确定最终输出所需的元素数据顺序,您可能需要重新排列下面输出部分中的项目顺序。

此外,为了使其工作,代码示例中的 $soapResponse 变量需要 在开始之前没有额外的 space <?xml version="1.0" encoding="utf-8"?>行。

如果您需要访问 XML 数据中的其他元素,您应该可以使用以下模式:$result->ConsultarAfiliadoResult->ElementNameHere.

<?php

$soapResponse = <<<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>
<ConsultarAfiliadoResponse xmlns="https://arssenasa.gob.do/">
<ConsultarAfiliadoResult>
<Contrato>8</Contrato>
<Cedula>013-0000655-6</Cedula>
<Nss>021827151</Nss>
<Nombres>MARGARET ADIRA</Nombres>
<Apellidos>SANTANA LORENZO DE CABRAL</Apellidos>
<IdEstado>0</IdEstado>
<CodigoFamiliar>8</CodigoFamiliar>
<IdRegimen xsi:nil="true" />
<Regimen>CONTRIBUTIVO</Regimen>
<FechaNacimiento>22/11/1973</FechaNacimiento>
<Edad>46</Edad>
<Sexo>FEMENINO</Sexo>
<TipoDocumento>0</TipoDocumento>
<CodigoAfiliado>8</CodigoAfiliado>
<MensajeAfiliado />
</ConsultarAfiliadoResult>
</ConsultarAfiliadoResponse>
</soap:Body>
</soap:Envelope>
XML;

// Remove <soap></soap> related tag information to get plain XML content
$xmlContent = preg_replace('/<soap:.*?>\n/', '', $soapResponse);
$xmlContent = preg_replace('/<\/soap:.*?>\n?/', '', $xmlContent);

// Note: there is an error with the xsi:nil="true" part, but that can be
// suppressed with the following line. If you need to deal with this error,
// more info here: https://www.php.net/manual/en/simplexml.examples-errors.php
libxml_use_internal_errors(true);

$result = new SimpleXMLElement($xmlContent);

// Print out results
printf(
    "%s%s%s%s%s%s%s%s%s%s%s%s",
    $result->ConsultarAfiliadoResult->Cedula,
    $result->ConsultarAfiliadoResult->Nss,
    $result->ConsultarAfiliadoResult->Nombres,
    $result->ConsultarAfiliadoResult->Apellidos,
    $result->ConsultarAfiliadoResult->IdEstado,
    $result->ConsultarAfiliadoResult->CodigoFamiliar,
    $result->ConsultarAfiliadoResult->Regimen,
    $result->ConsultarAfiliadoResult->FechaNacimiento,
    $result->ConsultarAfiliadoResult->Edad,
    $result->ConsultarAfiliadoResult->Sexo,
    $result->ConsultarAfiliadoResult->TipoDocumento,
    $result->ConsultarAfiliadoResult->CodigoAfiliado
);

?>

输出:

$ php q22.php
013-0000655-6021827151MARGARET ADIRASANTANA LORENZO DE CABRAL08CONTRIBUTIVO22/11/197346FEMENINO08

经过几乎一趟研究之旅,我终于找到了正确的方法:

   //The follow-up of my posting codes
    .
    .
    . 
   $response = curl_exec($curl);

   $response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "", $response);
    $xml = new SimpleXMLElement($response);
    $body = $xml->xpath('//soapBody ')[0];
    $array = json_decode(json_encode((array)$body), TRUE); 
    
    // in the case I want to grab only one data
    //echo  $array['ConsultarAfiliadoResponse']['ConsultarAfiliadoResult']['Cedula'];

    // to display all data in the array
    function dispaly_array_recursive($array_rec){
    if($array_rec){
    foreach($array_rec as $value){
    if(is_array($value)){
    dispaly_array_recursive($value);
    }else{
    echo $value.'<br>';
    }
    }
    }
    }
    dispaly_array_recursive($array);

现在保存到数据库没有问题了