Jump to content

http://php.net/manual/en/function.xml-parse-into-struct.php - seems complicated


Recommended Posts

I am trying to use this: http://php.net/manual/en/function.xml-parse-into-struct.php to parse this:

 

<?xml version="1.0" encoding="utf-8"?>
<PaymentNotification xmlns="http://">
  <PaymentMethod>card</PaymentMethod>
<Hash>12345KKLS</Hash>
<Payments>
    <Payment>
      <PaymentID>709750ba-b9b6-44c4-9812</PaymentID>
      <Amount>70</Amount>
      <Currency>USD</Currency>
      <Date>2011-05-11T07:41:44.957</Date>
      <StatusID>4</StatusID>
    </Payment>
    <Payment>
      <PaymentID>e0c66bae-c423-43c6-b896</PaymentID>
      <Amount>50</Amount>
      <Currency>USD</Currency>
      <Date>2011-05-11T07:42:13.55</Date>
      <StatusID>2</StatusID>
    </Payment>
  </Payments>
</PaymentNotification>

 

...but can't work out which numbers to use. I only need to grab the payment ID where the statusID is 4 (for each one as could be 1 or more per xml message).

 

It's very complicated http://php.net/manual/en/function.xml-parse-into-struct.php

simpleXML objects to the "xmlns='http//'", but if you remove that

 

<?php
$x = simplexml_load_file('payments.xml');
foreach($x->xpath('//Payment') as $p) {
    if ($p->StatusID == 2) {
        echo 'Amount: ', $p->Amount, ' ', $p->Currency, '<br />';
        echo 'Date  : ', $p->Date, '<br /><br /><br />';
    }
}

?>

 

Results:

 

Amount: 50 USD

Date : 2011-05-11T07:42:13.55

The namespace does add a bit of complexity, but it's still easier to deal with it than to use an array.

$xml = new SimpleXMLElement(

  card
12345KKLS

    
      709750ba-b9b6-44c4-9812
      70
      USD
      2011-05-11T07:41:44.957
      4
    
    
      e0c66bae-c423-43c6-b896
      50
      USD
      2011-05-11T07:42:13.55
      2
    
  

XML
, 0, false);

$xml->registerXPathNamespace("ns", current($xml->getDocNamespaces()));
$node = current($xml->xpath("//ns:Payment[ns:StatusID=4]"));

Thanks, I always have a problem with namespaces. This now works with the original xml giving same result

 

<?php
$x = simplexml_load_file('payments.xml');
$x->registerXPathNamespace("ns", current($x->getDocNamespaces()));

foreach($x->xpath('//ns:Payment') as $p) {
    if ($p->StatusID == 2) {
        echo 'Amount: ', $p->Amount, ' ', $p->Currency, '<br />';
        echo 'Date  : ', $p->Date, '<br /><br /><br />';
    }
}

?>

 

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.