33

Variable $d comes from file_get_contents function to a URL.

$answer = @new SimpleXMLElement($d);

Below is output of the print_r($answer):

SimpleXMLElement Object
(
  [Amount] => 2698
  [Status] => OK
  [State] => FL
  [Country] => USA
)

How can I retrieve value of each element and add to an array? I can't figure it out.

0

5 Answers 5

67

In this simple case type casting will also work:

$my_array = (array)$answer
Sign up to request clarification or add additional context in comments.

1 Comment

This is not recursive.
56

This should work:

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

2 Comments

I just tested and this works. Even does it recursively, which is great. I do worry about what will happen in the event of a non-UTF-8 character, though. The json_encode and json_decode methods tend to choke when they come across a non-UTF-8 character. Wrapping in a try...catch would be wise, though I don't know if there would be a way to handle it properly (i.e. encode to UTF-8) without writing a custom parser.
Both json_encode and http_build_query seem to have issues interpreting <![CDATA[ ]]> tags. It seems both functions determine them to be empty objects, in which case http_build_query ignores it completely.
13

The $answer can already work as an array. You can do this if you want put it in a real array,

$array = array();
foreach($answer as $k => $v) {
  $array[$k] = $v;
}

1 Comment

I can't iterate through a SimpleXMLElement object in the following way
8

I have a problem with this function because typecasting every XML child to an array can be problematic when the text is between CDATA tags.

I fixed this by checking if the result of the typecasting to an array is empty. If so typecast it to a string and you will get a proper result.

Here is my modified version with CDATA support:

function SimpleXML2ArrayWithCDATASupport($xml)
{   
    $array = (array)$xml;

    if (count($array) === 0) {
        return (string)$xml;
    }

    foreach ($array as $key => $value) {
        if (!is_object($value) || strpos(get_class($value), 'SimpleXML') === false) {
            continue;
        }
        $array[$key] = SimpleXML2ArrayWithCDATASupport($value);
    }

    return $array;
}

3 Comments

I found that json_encode and http_build_query suffer from the exact same symptoms, so this approach is the most reliable.
It's still ignoring CDATA fields. I had to do $xml = simplexml_load_file('file.xml',SimpleXMLElement::class,LIBXML_NOCDATA); but then your function wasn't needed anymore, I could just do json_decode(json_encode((array) $xml),true);
Sadly, still doesn't work with namespace data :/
1

this function parse a xml simpleXML recursive to array recursive

function SimpleXML2Array($xml){
    $array = (array)$xml;

    //recursive Parser
    foreach ($array as $key => $value){
        if(strpos(get_class($value),"SimpleXML")!==false){
            $array[$key] = SimpleXML2Array($value);
        }
    }

    return $array;
}

1 Comment

i have a problem with this function because typecasting every xml child to an array can give you a problem when the text is between CDATA tags.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.