2017-08-01 50 views
0

我在SO中搜索過,但沒有發現我找到的可以幫助我。XML中的SOAP XML - 如何用PHP解析

我正在與貨運服務JadLog進行系統集成。

當我將產品和傳遞變量傳遞給查詢時,返回XML。

返回例如:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
<valorarResponse xmlns=""> 
<ns1:valorarReturn xmlns:ns1="http://jadlogEdiws"> 
<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://www.jadlog.com.br/JadlogEdiWs/services"> 
    <Jadlog_Valor_Frete> 
     <versao>1.0</versao> 
     <Retorno>1458,62</Retorno> 
     <Mensagem>Valor do Frete</Mensagem> 
    </Jadlog_Valor_Frete> 
</string> 
</ns1:valorarReturn> 
</valorarResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

因此,有不止一個XML聲明,對吧?

我需要的唯一的價值是貨運的價值,這是在標籤Retorno。我這種情況下,1458,62。

什麼是我想要做的事:

$your_xml_response = file_get_contents($url_project); 

$clean_xml = str_replace('soapenv:', '', $your_xml_response); 

$xml = simplexml_load_string($clean_xml); 

var_dump($xml); 

什麼回報的:

object(SimpleXMLElement)[1] 
    public 'Body' => 
    object(SimpleXMLElement)[2] 
     public 'valorarResponse' => 
     object(SimpleXMLElement)[3] 

如果我嘗試回聲$ XML-> RETORNO,它返回空。

如何獲得標籤Retorno的價值?

回答

0

當我試圖加載您的XML字符串與simplexml_load_string它導致我 有多個XML聲明是不允許在XML中。這就是爲什麼我用正規快遞獲得Retorno的價值。可能是它不是在XML上使用正則表達式的最佳方法,但你可以試試。

<?php 
$re = '/<Retorno>(.*?)<\/Retorno>/m'; 
$str = '<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
<valorarResponse xmlns=""> 
<ns1:valorarReturn xmlns:ns1="http://jadlogEdiws"> 
<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://www.jadlog.com.br/JadlogEdiWs/services"> 
    <Jadlog_Valor_Frete> 
     <versao>1.0</versao> 
     <Retorno>1458,62</Retorno> 
     <Mensagem>Valor do Frete</Mensagem> 
    </Jadlog_Valor_Frete> 
</string> 
</ns1:valorarReturn> 
</valorarResponse> 
</soapenv:Body> 
</soapenv:Envelope> 
'; 

preg_match_all($re, $str, $matches); 

//debugging 
print '<pre>'; 
print_r($matches); 
print '<pre>'; 
//result 
echo $matches[0][0]; 
+0

謝謝!你救了我的一天!我編輯answare以幫助需要從url直接獲取xml的人 –

+0

@AndréDorneles很高興爲你工作。祝你好運:) –