图片 1

PHP如何将XML转成数组_php技能_脚本之家,PHP数组与XML之间的改动的事例

如果你使用 curl 获取的 xml
dataxml=simplexmlloadstring;data[′tk′]=jsondecode;如果是直接获取
URL 数据的话xml=simplexmlloadfile;data[′tk′]=jsondecode;先把
simplexml 对象转换成 json,再将 json 转换成数组。

PHP将数组转换成XML

首先,json是一种数据格式,而不能说是一种对象(object)。这一点是非常重要的。

  Forty What? Joe Jane  I know that's the answer -- but what's the question? XML;$xml=simplexml_load_string;$data = json_decode,TRUE);var_dump;var_dump;

object[1] public 'title' => string 'Forty What?'  public 'from' => string 'Joe'  public 'to' => string 'Jane'  public 'body' => string ' I know that's the answer -- but what's the question? ' array 'title' => string 'Forty What?'  'from' => string 'Joe'  'to' => string 'Jane'  'body' => string ' I know that's the answer -- but what's the question? ' 

PHP可以将数组转换成xml格式,简单的办法是遍历数组,然后将数组的key/value转换成xml节点,再直接echo输出了,如:

起源是不同的语言中数据对象的形式是不一样的,我们为了在不同的语言中传递数据,发明了一种json格式用于消除这种差异。比如,在js中,我们把js对象以json的格式来包装,然后把它字符串传递到其他的地方,比如java后台,这样后台取到这个字符串以后,就可以将其转化成一个json格式的java对象,否则java后台是无法识别一个js的对象的。可以说,json是不同的语言之间数据交换的一种桥梁,类似于之前的xml,只不过它比xml要来的更加简洁,方便,好用。

以上就是本文的全部内容,希望对大家的学习有所帮助。

 代码如下

1.js对象

以下是一个js的对象。我们可以看到它是一个键值对

var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '"W3C" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};

接下来我们使用var s = JSON.stringify(xiaoming);语句把上述的js对象包装成一个具有json格式的字符串。如下所示,然后我们就可以将这个字符串传递到其他地方区使用了。

{
  "name": "小明",
  "age": 14,
  "gender": true,
  "height": 1.65,
  "grade": null,
  "middle-school": ""W3C" Middle School",
  "skills": [
    "JavaScript",
    "Java",
    "Python",
    "Lisp"
  ]
}

function arrayToXml($arr){
    $xml = “<root>”;
    foreach ($arr as
$key=>$val){
        if(is_array($val)){
           
$xml.=”<“.$key.”>”.arrayToXml($val).”</”.$key.”>”;
        }else{
            $xml.=”<“.$key.”>”.$val.”</”.$key.”>”;
        }
    }
    $xml.=”</root>”;
    return $xml;
}

2.json的格式

观察上述的json格式的字符串,我们不难发现,他和js的对象十分接近,除了json格式的字符串需要用双引号包围住键。事实上,上述的json格式的字符串完全也可以的当成一个js对象,因为js并不排斥在键上面包围双引号。只不过这个js对象是json格式的js对象。也就是说,假如我们定义如下代码,是完全可以的。

var a={
  "name": "小明",
  "age": 14,
  "gender": true,
  "height": 1.65,
  "grade": null,
  "middle-school": ""W3C" Middle School",
  "skills": [
    "JavaScript",
    "Java",
    "Python",
    "Lisp"
  ]
}
console.log(a.name);

注意我的措辞,我始终没有说json对象,而是js对象,这是因为在js中只有js对象,而没有所谓的json对象。广义的js对象包含所有对象,如字符串,数字,object,而狭义的就只有object。也就是上面我们举例的xiaoming或者a这个对象。

我测试了下,这个最简单,速度又快,支持多为数组,中文也不会乱码。

3.格式错误

经常我们再js代码中需要接受一个其他地方传过来的json格式的字符串,然后通过JSON.parse()方法来把它变成json格式的js对象,这时候如果这个字符串不是json格式,就会报错。

常见的错误有以下几种。

a.键没有用双引号包围,这是最常见的错误。

b.最后一个键值对后面多了一个逗号,这是不允许的。如下面例子所示。

JSON.parse('[1, 2, 3, 4, ]');
JSON.parse('{"foo" : 1, }');
// SyntaxError JSON.parse: unexpected character 
// at line 1 column 14 of the JSON data

换成这样就不会报错了。

JSON.parse('[1, 2, 3, 4 ]');
JSON.parse('{"foo" : 1 }');

具体错误分析可以看这里:

另一种方法是利用DOMDocument来生成xml结构:

4.几个常用的方法

在js中,主要需要处理的是json格式的对象和json格式的字符串的转换问题。有以下几个常用的方法可以帮助我们做这些事情。

首先要确定的是,这些方法不仅适用于js对象,也试用于js数组。我们以例子来介绍。

–JSON.stringify:这个方法是将js对象转换成json格式的字符串。

//js对象
var xiaoming={
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '"W3C" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
}
//数组对象
var student = [{
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '"W3C" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
},{
    name: '小红',
    age: 13,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '"W3C" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
}];
var s1=JSON.stringify(xiaoming);
var s2=JSON.stringify(student);
console.log(s1);
console.log(s2);

console.log(s1.name);

上述代码的运行结果是

{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":""W3C" Middle School","skills":["JavaScript","Java","Python","Lisp"]}
Box.html:66:1
[{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":""W3C" Middle School","skills":["JavaScript","Java","Python","Lisp"]},{"name":"小红","age":13,"gender":true,"height":1.65,"grade":null,"middle-school":""W3C" Middle School","skills":["JavaScript","Java","Python","Lisp"]}]
Box.html:67:1
undefined

可以看到不管是js对象还是js数组对象,都转换成了标准的json格式的字符串,由于s1和s2都是字符串,自然无法使用s1.name这样的只要js对象才有的取值方式了。

–JSON.parse:该方法用于将json格式的字符串转换成js对象。首先要保证这个字符串是json格式的,否则该方法会报错,参照第3条。

//js对象
var xiaoming={
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '"W3C" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
}
//数组对象
var student = [{
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '"W3C" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
},{
    name: '小红',
    age: 13,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '"W3C" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
}];
var s1=JSON.stringify(xiaoming);
var s2=JSON.stringify(student);
var o1=JSON.parse(s1);
var o2=JSON.parse(s2);
console.log(o1);
console.log(o2);
console.log(o1.name);

上述代码的执行结果为:

图片 1

可以看到,转换成了js的标准的对象,键值是没有双引号的。这时候我们使用o1.name
就可以获取到name的值了。

与JSON.parse()相同效果的方法还有jQuery.parseJSON(data),eval(“(“+data+”)”),其中data是json格式的字符串,不推荐使用最后一种方法。

 

 代码如下

function arrayToXml($arr,$dom=0,$item=0){
    if (!$dom){
        $dom = new DOMDocument(“1.0”);
    }
    if(!$item){
        $item = $dom->createElement(“root”); 
        $dom->appendChild($item);
    }
    foreach ($arr as $key=>$val){
        $itemx = $dom->createElement(is_string($key)?$key:”item”);
        $item->appendChild($itemx);
        if (!is_array($val)){
            $text = $dom->createTextNode($val);
            $itemx->appendChild($text);
            
        }else {
            arrayToXml($val,$dom,$itemx);
        }
    }
    return $dom->saveXML();
}

它同样可以将数组转换成xml,而且支持多维数组,生成的xml中文也不会乱码。

PHP将XML转换成数组

做接口开发的时候经常会碰到别人提交给你的是xml格式的数据,常见的微信接口、支付宝接口等,他们的接口如发送消息通信都是xml格式的,那么我们先想办法拿到这个xml数据,然后再将其转化成数组。
假设我们获取到一个这样的XML:

 代码如下

<root>
<user>月光光abcd</user>
<pvs>13002</pvs>
<ips>
<baidu_ip>1200</baidu_ip>
<google_ip>1829</google_ip>
</ips>
<date>2016-06-01</date>
</root>

通过simplexml_load_string()解析读取xml数据,然后先转成json格式,再转换成数组。

 代码如下

function xmlToArray($xml){    
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $xmlstring = simplexml_load_string($xml, ‘SimpleXMLElement’,
LIBXML_NOCDATA);
    $val = json_decode(json_encode($xmlstring),true);  
    return $val;
}

得到数组后,我们就可以对数据进行各种处理了。

下面是网上的

 代码如下

class ArrayToXML
{
    /**
     * The main function for converting to an XML document.
     * Pass in a multi dimensional array and this recrusively loops
through and builds up an XML document.
     *
     * @param array $data
     * @param string $rootNodeName – what you want the root node to be

  • defaultsto data.
         * @param SimpleXMLElement $xml – should only be used recursively
         * @return string XML
         */
        public static function toXml($data, $rootNodeName = ‘data’,
    $xml=null)
        {
            // turn off compatibility mode as simple xml throws a wobbly if
    you don’t.
            if (ini_get(‘zend.ze1_compatibility_mode’) == 1)
            {
                ini_set (‘zend.ze1_compatibility_mode’, 0);
            }
           
            if ($xml == null)
            {
                $xml = simplexml_load_string(“<?xml version=’1.0′
    encoding=’utf-8′?><$rootNodeName />”);
            }
           
            // loop through the data passed in.
            foreach($data as $key => $value)
            {
                // no numeric keys in our xml please!
                if (is_numeric($key))
                {
                    // make string key…
                    $key = “unknownNode_”. (string) $key;
                }
               
                // replace anything not alpha numeric
                $key = preg_replace(‘/[^a-z]/i’, ”, $key);
               
                // if there is another array found recrusively call this
    function
                if (is_array($value))
                {
                    $node = $xml->addChild($key);
                    // recrusive call.
                    ArrayToXML::toXml($value, $rootNodeName, $node);
                }
                else
                {
                    // add single node.
                                    $value = htmlentities($value);
                    $xml->addChild($key,$value);
                }
               
            }
            // pass back as string. or simple xml object if you want!
            return $xml->asXML();
        }
    }

下面是我自己编辑的代码

 代码如下

function arrtoxml($arr,$dom=0,$item=0){
    if (!$dom){
        $dom = new DOMDocument(“1.0”);
    }
    if(!$item){
        $item = $dom->createElement(“root”);
        $dom->appendChild($item);
    }
    foreach ($arr as $key=>$val){
        $itemx = $dom->createElement(is_string($key)?$key:”item”);
        $item->appendChild($itemx);
        if (!is_array($val)){
            $text = $dom->createTextNode($val);
            $itemx->appendChild($text);
           
        }else {
            arrtoxml($val,$dom,$itemx);
        }
    }
    return $dom->saveXML();
}

XML转成数组

 代码如下

如果你使用 curl 获取的 xml data
$xml = simplexml_load_string($data);
$data[‘tk’] = json_decode(json_encode($xml),TRUE);
如果是直接获取 URL 数据的话
$xml = simplexml_load_file($data);
$data[‘tk’] = json_decode(json_encode($xml),TRUE);
先把 simplexml 对象转换成 json,再将 json 转换成数组。

发表评论

电子邮件地址不会被公开。 必填项已用*标注