2015-07-10 163 views
2

您好,我正在使用PHP在我的API調用中給出的soap xml響應,但我無法解析它,所以我可以正確地存儲到數據庫中。如何在PHP中解析soap xml?

<?xml version="1.0" encoding="UTF-8"?> 
<ns2:processedSalesOrderMessage xmlns:ns2="api.supplieroasis.com" xmlns:ns3="api.supplieroasis.com/retailorder" xmlns:ns4="https://mpc.overstock.com/jms/sofs"> 
    <ns2:processedSalesOrder> 
     <ns2:salesChannelOrderNumber>131415</ns2:salesChannelOrderNumber> 
     <ns2:salesChannelName>OFF_NETWORK</ns2:salesChannelName> 
     <ns2:orderDate>2015-06-05T09:19:18.000-06:00</ns2:orderDate> 
     <ns2:sofsCreatedDate>2015-06-05T09:19:20.000-06:00</ns2:sofsCreatedDate> 
     <ns2:warehouseName> 
     <ns2:code>1969</ns2:code> 
     </ns2:warehouseName> 
     <ns2:shipToAddress> 
     <ns2:contactName>Test Order1</ns2:contactName> 
     <ns2:address1>1969 S. Los Angeles St</ns2:address1> 
     <ns2:city>Los Angeles</ns2:city> 
     <ns2:stateOrProvince>CA</ns2:stateOrProvince> 
     <ns2:postalCode>90011</ns2:postalCode> 
     <ns2:countryCode>US</ns2:countryCode> 
     <ns2:phone>213-745-2023</ns2:phone> 
     </ns2:shipToAddress> 
     <ns2:returnAddress> 
     <ns2:contactName>1969</ns2:contactName> 
     <ns2:address1>1969 S. Los Angeles St</ns2:address1> 
     <ns2:city>Los Angeles</ns2:city> 
     <ns2:stateOrProvince>CA</ns2:stateOrProvince> 
     <ns2:postalCode>90011</ns2:postalCode> 
     <ns2:countryCode>US</ns2:countryCode> 
     <ns2:phone>213-745-2023</ns2:phone> 
     </ns2:returnAddress> 
     <ns2:shippingSpecifications> 
     <ns2:isThirdPartyBilling>false</ns2:isThirdPartyBilling> 
     <ns2:isSignatureRequired>false</ns2:isSignatureRequired> 
     <ns2:isDeclaredValueRequired>false</ns2:isDeclaredValueRequired> 
     <ns2:smallParcelShipment> 
      <ns2:shippingServiceLevel> 
       <ns2:code>GROUND</ns2:code> 
      </ns2:shippingServiceLevel> 
     </ns2:smallParcelShipment> 
     <ns2:isExport>false</ns2:isExport> 
     </ns2:shippingSpecifications> 
     <ns2:branding /> 
     <ns2:orderFulfillment>ALLOW_PARTIAL_FILL</ns2:orderFulfillment> 
     <ns2:orderId>47511</ns2:orderId> 
     <ns2:status>PROCESSING</ns2:status> 
     <ns2:retailChannelCode>OFF_NETWORK_1501</ns2:retailChannelCode> 
     <ns2:retailOrderNumber>131415</ns2:retailOrderNumber> 
     <ns2:actionRequired>true</ns2:actionRequired> 
     <ns2:processedSalesOrderLine> 
     <ns2:salesChannelLineId>1</ns2:salesChannelLineId> 
     <ns2:salesChannelLineNumber>1</ns2:salesChannelLineNumber> 
     <ns2:partnerSKU>ALDO_5225_37_48R</ns2:partnerSKU> 
     <ns2:barcode>ALDO_5225_37_48R</ns2:barcode> 
     <ns2:salesChannelSKU>ALDO_5225_37_48R</ns2:salesChannelSKU> 
     <ns2:quantity>1</ns2:quantity> 
     <ns2:itemPrice>0.00</ns2:itemPrice> 
     <ns2:lineId>54600</ns2:lineId> 
     <ns2:itemId>211437</ns2:itemId> 
     <ns2:itemName>Ferrecci Men's 'Zonettie' 2-piece Navy Suit</ns2:itemName> 
     <ns2:lineStatus>PROCESSING</ns2:lineStatus> 
     <ns2:unitCost>0.00</ns2:unitCost> 
     <ns2:unitCostCurrencyCode>USD</ns2:unitCostCurrencyCode> 
     </ns2:processedSalesOrderLine> 
    </ns2:processedSalesOrder> 
</ns2:processedSalesOrderMessage> 

我在API響應中得到這個字符串?請問任何人可以幫助我怎麼解析成PHP?

+2

http://php.net/manual/en/book.soap.php –

+0

有沒有給出代碼在你的問題中,你到目前爲止嘗試過什麼,以及你碰到了什麼。因此,已經關閉了與XML名稱空間和SOAP上下文遠程相關的第一眼看到的副本。它也可能被封閉的一般參考問題是:[你如何解析和處理PHP中的HTML/XML?](http://stackoverflow.com/q/3577641/367456)** – hakre

+0

但是它的不同於你說的重複的問題,因爲它有ns2的額外的節點和屬性:,它應該回答解決我的問題,既不應該重複... –

回答

2

你可以把它轉換成數組:

<?php 

$resp = '<?xml version="1.0" encoding="UTF-8"?> 
<ns2:processedSalesOrderMessage xmlns:ns2="api.supplieroasis.com" xmlns:ns3="api.supplieroasis.com/retailorder" xmlns:ns4="https://mpc.overstock.com/jms/sofs"> 
    <ns2:processedSalesOrder> 
     <ns2:salesChannelOrderNumber>131415</ns2:salesChannelOrderNumber> 
     <ns2:salesChannelName>OFF_NETWORK</ns2:salesChannelName> 
     <ns2:orderDate>2015-06-05T09:19:18.000-06:00</ns2:orderDate> 
     <ns2:sofsCreatedDate>2015-06-05T09:19:20.000-06:00</ns2:sofsCreatedDate> 
     <ns2:warehouseName> 
     <ns2:code>1969</ns2:code> 
     </ns2:warehouseName> 
     <ns2:shipToAddress> 
     <ns2:contactName>Test Order1</ns2:contactName> 
     <ns2:address1>1969 S. Los Angeles St</ns2:address1> 
     <ns2:city>Los Angeles</ns2:city> 
     <ns2:stateOrProvince>CA</ns2:stateOrProvince> 
     <ns2:postalCode>90011</ns2:postalCode> 
     <ns2:countryCode>US</ns2:countryCode> 
     <ns2:phone>213-745-2023</ns2:phone> 
     </ns2:shipToAddress> 
     <ns2:returnAddress> 
     <ns2:contactName>1969</ns2:contactName> 
     <ns2:address1>1969 S. Los Angeles St</ns2:address1> 
     <ns2:city>Los Angeles</ns2:city> 
     <ns2:stateOrProvince>CA</ns2:stateOrProvince> 
     <ns2:postalCode>90011</ns2:postalCode> 
     <ns2:countryCode>US</ns2:countryCode> 
     <ns2:phone>213-745-2023</ns2:phone> 
     </ns2:returnAddress> 
     <ns2:shippingSpecifications> 
     <ns2:isThirdPartyBilling>false</ns2:isThirdPartyBilling> 
     <ns2:isSignatureRequired>false</ns2:isSignatureRequired> 
     <ns2:isDeclaredValueRequired>false</ns2:isDeclaredValueRequired> 
     <ns2:smallParcelShipment> 
      <ns2:shippingServiceLevel> 
       <ns2:code>GROUND</ns2:code> 
      </ns2:shippingServiceLevel> 
     </ns2:smallParcelShipment> 
     <ns2:isExport>false</ns2:isExport> 
     </ns2:shippingSpecifications> 
     <ns2:branding /> 
     <ns2:orderFulfillment>ALLOW_PARTIAL_FILL</ns2:orderFulfillment> 
     <ns2:orderId>47511</ns2:orderId> 
     <ns2:status>PROCESSING</ns2:status> 
     <ns2:retailChannelCode>OFF_NETWORK_1501</ns2:retailChannelCode> 
     <ns2:retailOrderNumber>131415</ns2:retailOrderNumber> 
     <ns2:actionRequired>true</ns2:actionRequired> 
     <ns2:processedSalesOrderLine> 
     <ns2:salesChannelLineId>1</ns2:salesChannelLineId> 
     <ns2:salesChannelLineNumber>1</ns2:salesChannelLineNumber> 
     <ns2:partnerSKU>ALDO_5225_37_48R</ns2:partnerSKU> 
     <ns2:barcode>ALDO_5225_37_48R</ns2:barcode> 
     <ns2:salesChannelSKU>ALDO_5225_37_48R</ns2:salesChannelSKU> 
     <ns2:quantity>1</ns2:quantity> 
     <ns2:itemPrice>0.00</ns2:itemPrice> 
     <ns2:lineId>54600</ns2:lineId> 
     <ns2:itemId>211437</ns2:itemId> 
     <ns2:itemName>Ferrecci Men\'s \'Zonettie\' 2-piece Navy Suit</ns2:itemName> 
     <ns2:lineStatus>PROCESSING</ns2:lineStatus> 
     <ns2:unitCost>0.00</ns2:unitCost> 
     <ns2:unitCostCurrencyCode>USD</ns2:unitCostCurrencyCode> 
     </ns2:processedSalesOrderLine> 
    </ns2:processedSalesOrder> 
</ns2:processedSalesOrderMessage>'; 



$xml = simplexml_load_string($resp)->children('ns2',true); 
$json = json_encode($xml); 
$result = json_decode($json); 
echo '<pre>'; print_r($result); echo '<pre>'; 
die; 
+0

沒有它沒有工作 –

+0

@NaveedMetlo它怎麼沒有工作?它應該工作,$ xml是你得到的xml。不是字符串。 –

+0

僅供參考:我從api服務器獲取xml作爲字符串 –

1

試試這個,

$obj = simplexml_load_string($xml); 

foreach($obj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('urn:wsTest')->ServiceNameRQ->GetRatesRS->Rates->Rate as $rate) 
{ 
echo (string)$rate->RateName . "\n"; 
} 
+0

它也沒有工作 –