2014-01-16 4 views
0

Я пытаюсь интегрировать функциональность печати этикеток UPS в пользовательское приложение crm/shopping cart. Я формирую XML-документ, используя объект php stdClass. Я передаю методу массив, содержащий переменные пакета (ов) ex.Разбор XML с REGEX

$pkgs = Array ([1] => Array ([length] => 6 [width] => 8 [height] => 11 [weight] => 5) [2] => Array ([length] => 5 [width] => 14 [height] => 10 [weight] => 9)) 

Мой XML метод строительства выглядит следующим образом

public function assemble_xml($pkgs){ 
    $xmlRequest = new stdClass(); 
    $xmlRequest->header="<?xml version='1.0'?> 
<AccessRequest xml:lang='en-US'> 
<AccessLicenseNumber>HIDDEN</AccessLicenseNumber> 
<UserId>HIDDEN</UserId> 
<Password>HIDDEN</Password> 
</AccessRequest> 
<?xml version='1.0'?> 
<ShipmentConfirmRequest xml:lang='en-US'> 
<Request> 
    <TransactionReference> 
     <CustomerContext>Customer Comment</CustomerContext> 
     <XpciVersion/> 
    </TransactionReference> 
    <RequestAction>ShipConfirm</RequestAction> 
    <RequestOption>validate</RequestOption> 
</Request> 
<LabelSpecification> 
    <LabelPrintMethod> 
     <Code>GIF</Code> 
     <Description>gif file</Description> 
    </LabelPrintMethod> 
    <HTTPUserAgent>Mozilla/4.5</HTTPUserAgent> 
    <LabelImageFormat> 
     <Code>GIF</Code> 
     <Description>gif</Description> 
    </LabelImageFormat> 
</LabelSpecification> 
<Shipment> 
    <RateInformation> 
     <NegotiatedRatesIndicator/> 
    </RateInformation> 
    <Description/> 
    <Shipper> 
     <Name>HIDDEN</Name> 
     <PhoneNumber>HIDDEN</PhoneNumber> 
     <ShipperNumber>HIDDEN</ShipperNumber> 
     <TaxIdentificationNumber>HIDDEN</TaxIdentificationNumber> 
     <Address> 
      <AddressLine1>HIDDEN</AddressLine1> 
      <City>HIDDEN</City> 
      <StateProvinceCode>HIDDEN</StateProvinceCode> 
      <PostalCode>HIDDEN</PostalCode> 
      <PostcodeExtendedLow></PostcodeExtendedLow> 
      <CountryCode>HIDDEN</CountryCode> 
     </Address> 
    </Shipper>"; 
    $xmlRequest->shipto="<ShipTo> 
     <CompanyName>HIDDEN</CompanyName> 
     <AttentionName>HIDDEN</AttentionName> 
     <PhoneNumber></PhoneNumber> 
     <Address> 
      <AddressLine1>HIDDEN</AddressLine1> 
      <City>HIDDEN</City> 
      <StateProvinceCode>HIDDEN</StateProvinceCode> 
      <PostalCode>HIDDEN</PostalCode> 
      <CountryCode>HIDDEN</CountryCode> 
     </Address> 
    </ShipTo>"; 
    $xmlRequest->shipper="<ShipFrom> 
     <CompanyName>HIDDEN</CompanyName> 
     <AttentionName></AttentionName> 
     <PhoneNumber>HIDDEN</PhoneNumber> 
     <TaxIdentificationNumber>HIDDEN</TaxIdentificationNumber> 
     <Address> 
      <AddressLine1>HIDDEN</AddressLine1> 
      <City>HIDDEN</City> 
      <StateProvinceCode>HIDDEN</StateProvinceCode> 
      <PostalCode>HIDDEN</PostalCode> 
      <CountryCode>HIDDEN</CountryCode> 
     </Address> 
    </ShipFrom>"; 
    $xmlRequest->payment="<PaymentInformation> 
     <Prepaid> 
      <BillShipper> 
       <AccountNumber>HIDDEN</AccountNumber> 
      </BillShipper> 
     </Prepaid> 
    </PaymentInformation>"; 
    $xmlRequest->service="<Service> 
     <Code>03</Code> 
     <Description>Ground</Description> 
    </Service>"; 
    for($i = 1; $i <= count($pkgs); $i++) { 
     $xmlRequest->$i ="<Package> 
     <PackagingType> 
      <Code>02</Code> 
      <Description>Customer Supplied</Description> 
     </PackagingType> 
     <Description>Package</Description> 
     <ReferenceNumber> 
      <Code></Code> 
      <Value></Value> 
     </ReferenceNumber> 
     <Dimensions> 
      <UnitOfMeasurement> 
       <Code>IN</Code> 
      </UnitOfMeasurement> 
       <Length>22</Length> 
       <Width>20</Width> 
       <Height>18</Height> 
     </Dimensions> 
     <PackageWeight> 
     <Weight>14.1</Weight> 
     </PackageWeight> 
     <AdditionalHandling>0</AdditionalHandling> 
    </Package>"; 
    } 
    $xmlRequest->footer="</Shipment> 
</ShipmentConfirmRequest>"; 
return $xmlRequest; 

Прохладный, который работает. Теперь я передаю это через несколько других функций, чтобы получить мой дайджест.

public function ups_send($assemble_xml){ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://wwwcie.ups.com/ups.app/xml/ShipConfirm"); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $assemble_xml); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 3600); 
    $xmlResponse = curl_exec ($ch); 
    return $xmlResponse; 



    public function get_confirm_response($xmlResponse){ 
    preg_match_all("/\<ShipmentConfirmResponse\>(.*?)\<\/ShipmentConfirmResponse\>/s", 
    $xmlResponse, $bookblocks); 
    foreach($bookblocks[1] as $block) 
    { 
    preg_match_all("/\<ShipmentDigest\>(.*?)\<\/ShipmentDigest\>/", 
     $block, $author); // SHIPPING DIGEST 

    $digest = $author[1][0]; 
    $this->decode_label($digest); 

    } 
    } 



    public function decode_label($digest){ 
    $xmlRequest1="<?xml version='1.0' encoding='ISO-8859-1'?> 
        <AccessRequest> 
          <AccessLicenseNumber>HIDDEN</AccessLicenseNumber> 
         <UserId>HIDDEN</UserId> 
         <Password>HIDDEN</Password> 
        </AccessRequest> 
        <?xml version=”1.0? encoding=”ISO-8859-1??> 
        <ShipmentAcceptRequest> 
         <Request> 
          <TransactionReference> 
           <CustomerContext>Customer Comment</CustomerContext> 
          </TransactionReference> 
          <RequestAction>ShipAccept</RequestAction> 
          <RequestOption>1</RequestOption> 
         </Request> 
         <ShipmentDigest>$digest</ShipmentDigest> 
        </ShipmentAcceptRequest>"; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://wwwcie.ups.com/ups.app/xml/ShipAccept"); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 3600); 

    $xmlResponse = curl_exec ($ch); // SHIP ACCEPT RESPONSE 

    $xml = $xmlResponse; 



    preg_match_all("/\<ShipmentAcceptResponse\>(.*?)\<\/ShipmentAcceptResponse\>/s", 
     $xml, $bookblocks); 

    foreach($bookblocks[1] as $block) 
    { 

     preg_match_all("/\<GraphicImage\>(.*?)\<\/GraphicImage\>/", 
     $block, $author); // GET LABEL 


     for($l=0; $l<=count($author[0])-1; $l++){ 

      echo '<img src="data:image/gif;base64,'. $author[1][$l]. '"/>'; 

     } 

    } 

} 

Это все работает с 1 или 2 этикетки, этикетки успешно декодируется на этикетке 1 2 и 2 из 2. НО, когда я пытаюсь сделать 3 или более меток я получаю успешный XML-ответ от ИБП, но Я не создаю ярлыков. Я несколько дней стучал головой о мой стол, и мог действительно использовать опыт SO, чтобы дать мне толчок в правильном направлении о том, что я делаю неправильно. Почему работает 1 или 2 ярлыка, но 3 или более нет? ЧТО ДАЕТ!

Если его регулярное выражение ошибочно, то почему оно работает, если запрошено только 2 метки?

Существует приписка вам может быть интересно.

Вот Pastebin ответа XML от ИБП, содержащие надписи.

http://pastebin.com/h3nhNQ0R

+0

вы пробовали разместить это в сообществе разработчиков ИБП, так как это может быть немного специфично для здесь? –

+0

Нет, нет, я сделаю это. Основная причина, по которой я не делал этого, - это то, что я получаю успешный ответ от ИБП. Я просто не могу правильно разобрать его, если запрошу более трех ярлыков. Если я запрашиваю только 1 или 2 ярлыка, это работает как шарм. Я полагал, что это была какая-то проблема с программированием. Спасибо, что нашли время ответить, я действительно ценю это! – MDS

+1

[Обязательная ссылка] (http://stackoverflow.com/a/1732454/2846923) для всех вопросов XML/[X] HTML-regex. –

ответ

1

После прочтения ссылки вы люди, предоставленные, я узнал, что не только я схожу с ума, пытаясь сделать это, когда явно более подходящее решение было доступно, но и

«Предоставление в к Им и их кощунственным путям, которые обрекают нас всех на бесчеловечные труды для Того, чье имя не может быть выражено ». ~ Bobince

Я заменил этому нечестивого плачущего ребенок

preg_match_all("/\<ShipmentAcceptResponse\>(.*?)\<\/ShipmentAcceptResponse\>/s", 
     $xml, $bookblocks); 

    foreach($bookblocks[1] as $block) 
    { 

     preg_match_all("/\<GraphicImage\>(.*?)\<\/GraphicImage\>/", 
     $block, $author); // GET LABEL 


     for($l=0; $l<=count($author[0])-1; $l++){ 

      echo '<img src="data:image/gif;base64,'. $author[1][$l]. '"/>'; 

     } 

    } 

с этим красивым раствором

$label_resp = new SimpleXMLElement($xml); 
    foreach($label_resp->ShipmentResults->PackageResults as $package){ 
     echo '<img src="data:image/gif;base64,'. $package->LabelImage->GraphicImage. '"/>'; 
    } 

Мало того, что она работала отлично, она также работает круги вокруг первоначальной скорости решения мудрой.

Благодарим вас, спасители человечества, за ваш толчок в правильном направлении.