Jump to content

How to parse this XML array?


Go to solution Solved by Barand,

Recommended Posts

Hello everyone,

 

For an application I'm working on I'm connecting to a webservice which gives me an XML as response. I have no influence on how that XML is formatted and I am trying to figure out how to parse this result.

 

The XML I get back is (truncated because it's way too long):

 


<browse result="1" first="1" last="65" total="65">
<th>
<td label="dimension" hideforuser="false" type="String">fin.trs.line.dim2</td>
<td label="Outstanding" hideforuser="false" type="Value">fin.trs.line.openbasevaluesigned</td>
<td label="Factuurbedrag" hideforuser="false" type="Value">fin.trs.line.basevaluesigned</td>
<td label="Invoice Number" hideforuser="false" type="String">fin.trs.line.invnumber</td>
<td label="" hideforuser="false" type="String">fin.trs.head.code</td>
<td label="Pay date" hideforuser="false" type="Date">fin.trs.line.matchdate</td>
<td label="Vervaldatum" hideforuser="false" type="Date">fin.trs.line.datedue</td>
<td label="Datum" hideforuser="false" type="Date">fin.trs.head.date</td>
<td label="boektype" hideforuser="false" type="String">fin.trs.head.status</td>
<td label="paystatus" hideforuser="false" type="String">fin.trs.line.availableforpayruns</td>
</th>
<tr>
<td field="fin.trs.line.dim2" hideforuser="false" type="String">2001</td>
<td field="fin.trs.line.openbasevaluesigned" hideforuser="false" type="Value">-629.93</td>
<td field="fin.trs.line.basevaluesigned" hideforuser="false" type="Value">-629.93</td>
<td field="fin.trs.line.invnumber" hideforuser="false" type="String"/>
<td field="fin.trs.head.code" hideforuser="false" type="String">BEGINBALANS</td>
<td field="fin.trs.line.matchdate" hideforuser="false" type="Date"/>
<td field="fin.trs.line.datedue" hideforuser="false" type="Date" name="31/10/2011">20111031</td>
<td field="fin.trs.head.date" hideforuser="false" type="Date" name="01/10/2011">20111001</td>
<td field="fin.trs.head.status" hideforuser="false" type="String" name="Definitief">final</td>
<td field="fin.trs.line.availableforpayruns" hideforuser="false" type="String" name="Ja">true</td>
<key>
<office>NLA003802</office>
<code>BEGINBALANS</code>
<number>201100001</number>
<line>16</line>
</key>
</tr>
<tr>
<td field="fin.trs.line.dim2" hideforuser="false" type="String">2000</td>
<td field="fin.trs.line.openbasevaluesigned" hideforuser="false" type="Value">-3570.00</td>
<td field="fin.trs.line.basevaluesigned" hideforuser="false" type="Value">-3570.00</td>
<td field="fin.trs.line.invnumber" hideforuser="false" type="String"/>
<td field="fin.trs.head.code" hideforuser="false" type="String">BEGINBALANS</td>
<td field="fin.trs.line.matchdate" hideforuser="false" type="Date"/>
<td field="fin.trs.line.datedue" hideforuser="false" type="Date" name="31/10/2011">20111031</td>
<td field="fin.trs.head.date" hideforuser="false" type="Date" name="01/10/2011">20111001</td>
<td field="fin.trs.head.status" hideforuser="false" type="String" name="Definitief">final</td>
<td field="fin.trs.line.availableforpayruns" hideforuser="false" type="String" name="Ja">true</td>
<key>
<office>NLA003802</office>
<code>BEGINBALANS</code>
<number>201100001</number>
<line>17</line>
</key>
</tr>

After I've done simplexml_load_string($result->ProcessXmlStringResult) it turns into:

SimpleXMLElement Object ( [@attributes] => Array ( [result] => 1 [first] => 1 [last] => 65 [total] => 65 ) [th] => SimpleXMLElement Object ( [td] => Array ( [0] => fin.trs.line.dim2 [1] => fin.trs.line.openbasevaluesigned [2] => fin.trs.line.basevaluesigned [3] => fin.trs.line.invnumber [4] => fin.trs.head.code [5] => fin.trs.line.matchdate [6] => fin.trs.line.datedue [7] => fin.trs.head.date [8] => fin.trs.head.status [9] => fin.trs.line.availableforpayruns ) ) [tr] => Array ( [0] => SimpleXMLElement Object ( [td] => Array ( [0] => 2001 [1] => -629.93 [2] => -629.93 [3] => SimpleXMLElement Object ( [@attributes] => Array ( [field] => fin.trs.line.invnumber [hideforuser] => false [type] => String ) ) [4] => BEGINBALANS [5] => SimpleXMLElement Object ( [@attributes] => Array ( [field] => fin.trs.line.matchdate [hideforuser] => false [type] => Date ) ) [6] => 20111031 [7] => 20111001 [8] => final [9] => true ) [key] => SimpleXMLElement Object ( [office] => NLA003802 [code] => BEGINBALANS [number] => 201100001 [line] => 16 ) ) [1] => SimpleXMLElement Object ( [td] => Array ( [0] => 2000 [1] => -3570.00 [2] => -3570.00 [3] => SimpleXMLElement Object ( [@attributes] => Array ( [field] => fin.trs.line.invnumber [hideforuser] => false [type] => String ) ) [4] => BEGINBALANS [5] => SimpleXMLElement Object ( [@attributes] => Array ( [field] => fin.trs.line.matchdate [hideforuser] => false [type] => Date ) ) [6] => 20111031 [7] => 20111001 [8] => final [9] => true ) [key] =

I don't know the following things:

 

1. Am I doing a smart move by doing the simplexml_load_string in the first place? Or should I just 'parse' the XML I get in return? The XML is a little complicated to me because it makes use of the '<td field="name">value here</td> construct.

2. How do I get the field name and the corresponding value out of the XML or the array?

 

What I need is the names and values in the <td> elements under <tr> and the values under <key>

 

I've been looking for a way for 2 days now and I'm hoping very much you can help. If you can get me started that would be great.

 

Thank you so much in advance.

Link to comment
https://forums.phpfreaks.com/topic/284949-how-to-parse-this-xml-array/
Share on other sites

  • Solution

try

$xml = simplexml_load_string($str);
#echo '<pre>',print_r($xml, true),'</pre>';
foreach ($xml->tr as $tr) {
    echo "<h4>td</h4>";
    foreach ($tr->td as $td) {
        echo "{$td['field']} : $td<br>";
    }
    echo "<h4>key</h4>";
    echo "office: $tr->key->office<br>";
    echo "code: $tr->key->code<br>";
    echo "number: $tr->key->number<br>";
    echo "line: $tr->key->line<br>";
}

The code I posted almost worked for the extract you provided (with the addition of </browse> at the end. I have since added {...} to fix the bug when printing the <key> values

$xml = simplexml_load_string($str);
#echo '<pre>',print_r($xml, true),'</pre>';
foreach ($xml->tr as $tr) {
    echo "<h4>td</h4>";
    foreach ($tr->td as $td) {
        echo "{$td['field']} : $td<br>";
    }
    echo "<h4>key</h4>";
    echo "office: {$tr->key->office}<br>";
    echo "code: {$tr->key->code}<br>";
    echo "number: {$tr->key->number}<br>";
    echo "line: {$tr->key->line}<br>";
}

/***  RESULTS  ***********************************************
td

fin.trs.line.dim2 : 2001
fin.trs.line.openbasevaluesigned : -629.93
fin.trs.line.basevaluesigned : -629.93
fin.trs.line.invnumber :
fin.trs.head.code : BEGINBALANS
fin.trs.line.matchdate :
fin.trs.line.datedue : 20111031
fin.trs.head.date : 20111001
fin.trs.head.status : final
fin.trs.line.availableforpayruns : true

key

office: NLA003802
code: BEGINBALANS
number: 201100001
line: 16

td

fin.trs.line.dim2 : 2000
fin.trs.line.openbasevaluesigned : -3570.00
fin.trs.line.basevaluesigned : -3570.00
fin.trs.line.invnumber :
fin.trs.head.code : BEGINBALANS
fin.trs.line.matchdate :
fin.trs.line.datedue : 20111031
fin.trs.head.date : 20111001
fin.trs.head.status : final
fin.trs.line.availableforpayruns : true

key

office: NLA003802
code: BEGINBALANS
number: 201100001
line: 17
****************************************************************/

It depends on how much pruning you did before posting. If the <browse> tag is embedded inside other tags you need to adjust to take the parent(s) into account, but I cannot to more without the full xml structure.

The code I posted almost worked for the extract you provided (with the addition of </browse> at the end. I have since added {...} to fix the bug when printing the <key> values

$xml = simplexml_load_string($str);
#echo '<pre>',print_r($xml, true),'</pre>';
foreach ($xml->tr as $tr) {
    echo "<h4>td</h4>";
    foreach ($tr->td as $td) {
        echo "{$td['field']} : $td<br>";
    }
    echo "<h4>key</h4>";
    echo "office: {$tr->key->office}<br>";
    echo "code: {$tr->key->code}<br>";
    echo "number: {$tr->key->number}<br>";
    echo "line: {$tr->key->line}<br>";
}

/***  RESULTS  ***********************************************
td

fin.trs.line.dim2 : 2001
fin.trs.line.openbasevaluesigned : -629.93
fin.trs.line.basevaluesigned : -629.93
fin.trs.line.invnumber :
fin.trs.head.code : BEGINBALANS
fin.trs.line.matchdate :
fin.trs.line.datedue : 20111031
fin.trs.head.date : 20111001
fin.trs.head.status : final
fin.trs.line.availableforpayruns : true

key

office: NLA003802
code: BEGINBALANS
number: 201100001
line: 16

td

fin.trs.line.dim2 : 2000
fin.trs.line.openbasevaluesigned : -3570.00
fin.trs.line.basevaluesigned : -3570.00
fin.trs.line.invnumber :
fin.trs.head.code : BEGINBALANS
fin.trs.line.matchdate :
fin.trs.line.datedue : 20111031
fin.trs.head.date : 20111001
fin.trs.head.status : final
fin.trs.line.availableforpayruns : true

key

office: NLA003802
code: BEGINBALANS
number: 201100001
line: 17
****************************************************************/

It depends on how much pruning you did before posting. If the <browse> tag is embedded inside other tags you need to adjust to take the parent(s) into account, but I cannot to more without the full xml structure.

I get what you mean :) It worked right away tho. I'm very happy with this. Now I understand the way it's supposed to be done I can continue. Once again thank you very much!

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.