【问题标题】:how to parse soap xml in php? [duplicate]如何在php中解析soap xml? [复制]
【发布时间】:2023-03-08 09:13:01
【问题描述】:

您好,我在使用 PHP 的 API 调用中收到了下面给出的肥皂 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???

【问题讨论】:

  • 您的问题中没有给出代码,到目前为止您尝试了什么以及遇到了什么问题。因此,它已针对与 XML 名称空间和 SOAP 上下文远程相关的第一眼重复项关闭。它也可能被关闭的一般参考问题是:How do you parse and process HTML/XML in PHP?
  • 但它与你所说的重复的问题不同,因为它具有 ns2 的额外节点和属性:,应该回答它以解决我的问题,也不应该重复......

标签: php xml soap xml-parsing


【解决方案1】:

您可以将其转换为数组:

<?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;

【讨论】:

  • @NaveedMetlo 怎么没用?它应该可以工作,$xml 是你得到的 xml。不是字符串。
  • 仅供参考:我从 api 服务器获取该 xml 作为字符串
  • @NaveedMetlo 嗨,我更新了答案。你可以试试看。
  • 哇,这次成功了,非常感谢 josua....
  • 是的,它现在是绿色的,再次感谢您的帮助好友
【解决方案2】:

试试这个,

$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";
}

【讨论】:

  • 也没用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2013-06-06
  • 2011-05-10
相关资源
最近更新 更多