PHP convert XML to JSON

前端 未结 20 1783
生来不讨喜
生来不讨喜 2020-11-22 06:25

I am trying to convert xml to json in php. If I do a simple convert using simple xml and json_encode none of the attributes in the xml show.

$xml = simplexml         


        
20条回答
  •  無奈伤痛
    2020-11-22 07:05

    Found FTav's answer the most useful as it is very customizable, but his xml2js function has some flaws. For instance, if children elements has equal tagnames they all will be stored in a single object, this means that the order of elements will not be preserved. In some cases we really want to preserve order, so we better store every element's data in a separate object:

    function xml2js($xmlnode) {
        $jsnode = array();
        $nodename = $xmlnode->getName();
        $current_object = array();
    
        if (count($xmlnode->attributes()) > 0) {
            foreach($xmlnode->attributes() as $key => $value) {
                $current_object[$key] = (string)$value;
            }
        }
    
        $textcontent = trim((string)$xmlnode);
        if (strlen($textcontent) > 0) {
            $current_object["content"] = $textcontent;
        }
    
        if (count($xmlnode->children()) > 0) {
            $current_object['children'] = array();
            foreach ($xmlnode->children() as $childxmlnode) {
                $childname = $childxmlnode->getName();
                array_push($current_object['children'], xml2js($childxmlnode, true));
            }
        }
    
        $jsnode[ $nodename ] = $current_object;
        return $jsnode;
    }
    

    Here is how it works. Initial xml structure:

    
      With text
      
      The last one
    
    

    Result JSON:

    {
        "some-tag": {
            "some-attribute": "value of some attribute",
            "children": [
                {
                    "another-tag": {
                        "content": "With text"
                    }
                },
                {
                    "surprise": []
                },
                {
                    "another-tag": {
                        "content": "The last one"
                    }
                }
            ]
        }
    }
    

提交回复
热议问题