Parse ArrayOfString from SimpleXML

416 Views Asked by At

I am fetching a large block of XML data from a MySQL Database and attempting to parse out the relevant information. There is an ArrayOfString which I have never seen before, however I need to get the values out of it for use.

I have tried several methods including SimpleXML's __ToString(), casting it with (string) and so on but no luck. How can I properly convert this to either a string that I can explode into array, or just to an array?

        $game_ids = $machine_xml->add[25]->attributes()->value[0];
        var_dump($game_ids);

Results:

object(SimpleXMLElement)#2 (1) {
  [0]=>
  string(331) "<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <string>7</string>
  <string>46</string>
  <string>4</string>
  <string>60</string>
  <string>5</string>
  <string>23</string>
  <string>50</string>
</ArrayOfString>"
}
1

There are 1 best solutions below

0
On

Firstly, you seem to have XML wrapped in XML. That is, your XML document looks, in part, like this:

<add value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;ArrayOfString xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;  &lt;string&gt;7&lt;/string&gt;  &lt;string&gt;46&lt;/string&gt;  &lt;string&gt;4&lt;/string&gt;  &lt;string&gt;60&lt;/string&gt;  &lt;string&gt;5&lt;/string&gt;  &lt;string&gt;23&lt;/string&gt;  &lt;string&gt;50&lt;/string&gt; &lt;/ArrayOfString&gt;">

So the first thing you need to do is get that inner piece of XML, and parse it with SimpleXML:

$game_ids = $machine_xml->add[25]->attributes()->value[0];
$inner_xml = (string)$game_ids;
$inner_sxe = simplexml_load_string($inner_xml);

Now, you have a fairly straight-forward XML document: a single <ArrayOfString> element containing a series of <string> elements. So you can just loop over them with a foreach statement, and collect into an array:

$array = [];
foreach ( $inner_sxe->string as $string_element ) {
      $string_value = (string)$string_element;
      $array[] = $string_value;
}