user1048676
user1048676

Reputation: 10066

Read XML from MySQL Database into PHP

I have the following XML structure stored in my database:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Payouts>
<Range end="1" start="1">900</Range>
<Range end="2" start="2">650</Range>     
<Range end="3" start="3">450</Range>     
<Range end="4" start="4">330</Range>     
<Range end="5" start="5">230</Range>     
<Range end="6" start="6">175</Range>     
<Range end="7" start="7">120</Range>     
<Range end="8" start="8">95</Range>     
<Range end="9" start="9">80</Range>     
<Range end="10" start="10">70</Range>     
<Range end="15" start="11">50</Range>     
<Range end="20" start="16">35</Range>     
<Range end="25" start="21">25</Range>     
<Range end="30" start="26">18</Range>     
<Range end="40" start="31">15</Range>     
<Range end="50" start="41">14</Range>     
<Range end="75" start="51">13</Range>     
<Range end="100" start="76">12</Range>     
<Range end="125" start="100">11</Range>     
<Range end="150" start="126">10</Range>     
<Range end="200" start="151">9</Range>     
<Range end="350" start="201">8</Range>     
<Range end="360" start="351">7</Range>     
<Range end="380" start="361">6</Range>   
<Range end="400" start="381">5</Range>   
<Range end="420" start="401">4</Range>   
<Range end="440" start="421">3</Range>   
<Range end="460" start="441">2</Range>   
<Range end="480" start="461">1</Range>   
<Range end="500" start="481">1</Range>   
<Range end="520" start="501">1</Range>   
</Payouts>

This is basically a range of options. I'd like to filter through these results and get the value in the end and start and then display the value for that row.

The output would be something like the following:

1st - 900 2nd - 650 3rd - 450 4th - 330 5th - 230 6th - 175 7th - 120 8th - 95 9th - 80 10th - 70 11th to 15th - 50 16th to 20th - 35 21th to 25th - 25

I tried to read the XML file with the following code:

$payout_xml = $event_details[0]['PAYOUT_DETAILS'];
$xml = new SimpleXMLElement($payout_xml);
echo "The Simple Element is: ".print_r($xml);
echo 'single value: <br />';
echo $xml->Payouts->Range->end; // get single value
echo "end of data";

When I print_r the $payout_xml I get the following results:

SimpleXMLElement Object
(
[Range] => Array
    (
        [0] => 900
        [1] => 650
        [2] => 450
        [3] => 330
        [4] => 230
        [5] => 175
        [6] => 120
        [7] => 95
        [8] => 80
        [9] => 70
        [10] => 50
        [11] => 35
        [12] => 25
        [13] => 18
        [14] => 15
        [15] => 14
        [16] => 13
        [17] => 12
        [18] => 11
        [19] => 10
        [20] => 9
        [21] => 8
        [22] => 7
        [23] => 6
        [24] => 5
        [25] => 4
        [26] => 3
        [27] => 2
        [28] => 1
        [29] => 1
        [30] => 1
    )

)
The Simple Element is: 1 

I'm not accessing the data though. How can I do this?

Upvotes: 0

Views: 28

Answers (1)

chris85
chris85

Reputation: 23892

end is an attribute, not an element. Try something like:

echo $sxml->Range . '|' . $sxml->Range['end'] . '|' . $sxml->Range['start'];

which will give the output as

900|1|1

Functional example

$xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Payouts>
<Range end="1" start="1">900</Range>
<Range end="2" start="2">650</Range>     
<Range end="3" start="3">450</Range>     
<Range end="4" start="4">330</Range>     
<Range end="5" start="5">230</Range>     
<Range end="6" start="6">175</Range>     
<Range end="7" start="7">120</Range>     
<Range end="8" start="8">95</Range>     
<Range end="9" start="9">80</Range>     
<Range end="10" start="10">70</Range>     
<Range end="15" start="11">50</Range>     
<Range end="20" start="16">35</Range>     
<Range end="25" start="21">25</Range>     
<Range end="30" start="26">18</Range>     
<Range end="40" start="31">15</Range>     
<Range end="50" start="41">14</Range>     
<Range end="75" start="51">13</Range>     
<Range end="100" start="76">12</Range>     
<Range end="125" start="100">11</Range>     
<Range end="150" start="126">10</Range>     
<Range end="200" start="151">9</Range>     
<Range end="350" start="201">8</Range>     
<Range end="360" start="351">7</Range>     
<Range end="380" start="361">6</Range>   
<Range end="400" start="381">5</Range>   
<Range end="420" start="401">4</Range>   
<Range end="440" start="421">3</Range>   
<Range end="460" start="441">2</Range>   
<Range end="480" start="461">1</Range>   
<Range end="500" start="481">1</Range>   
<Range end="520" start="501">1</Range>   
</Payouts>';
$sxml = new SimpleXMLElement($xml);
echo $sxml->Range . '|' . $sxml->Range['end'] . '|' . $sxml->Range['start']; // get single value

Demo: https://eval.in/583665

or if you want to iterate through all records, https://eval.in/583666.

foreach($sxml->Range as $range){
     echo $range . '|' . $range['end'] . '|' . $range['start'] . "\n";
}

Upvotes: 1

Related Questions