什么是最好的 php DOM 2 Array 函数? [英] What is the best php DOM 2 Array function?

查看:18
本文介绍了什么是最好的 php DOM 2 Array 函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想解析xml文件,到目前为止,我发现的最好方法是使用 DOMDocument() 类.

I want to parse xml files, The best way I found is to use DOMDocument() class so far.

示例 xml 字符串:

sample xml string:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<response>
<resData>
<contact:infData xmlns:contact="http://example.com/contact-1.0">
<contact:status s="value1"/>
<contact:status s="value2"/>
<contact:status s="value3"/>
<contact:status s="value4"/>
</contact:infData>
</resData>
</response>

我使用函数 dom2array(波纹管)来解析 dom,但它只返回 1 个元素(仅 value4)

I use function dom2array (bellow) to parse dom, but it only return 1 element (value4 only)

<?php
    function dom2array($node) {
    $res = array();
    if($node->nodeType == XML_TEXT_NODE){
       $res = $node->nodeValue;
    }else{
       if($node->hasAttributes()){
           $attributes = $node->attributes;
            if(!is_null($attributes)){
               $res['@attributes'] = array();
               foreach ($attributes as $index=>$attr) {
                   $res['@attributes'][$attr->name] = $attr->value;
               }
           }
       }
       if($node->hasChildNodes()){
           $children = $node->childNodes;
           for($i=0;$i<$children->length;$i++){
               $child = $children->item($i);
               $res[$child->nodeName] = dom2array($child);
           }
       }
    }
    return $res;
    }
?>

有没有办法解析所有的xml元素并将它们发送到一个数组中?

Is there any way to parse all xml elements and sent them to an array?

输出数组:

Array
(
[response] => Array
    (
        [#text] => 

        [resData] => Array
            (
                [#text] => 

                [contact:infData] => Array
                    (
                        [#text] => 

                        [contact:status] => Array
                            (
                                [@attributes] => Array
                                    (
                                        [s] => value4
                                    )

                            )

                    )

            )

    )

)

value1、value2、value3 在哪里?:(谢谢

Where is value1, value2, value3 ? :( Thank you

推荐答案

你可以使用这个(基于:http://php.net/manual/en/book.dom.php#93717);

You can use this (based on: http://php.net/manual/en/book.dom.php#93717);

function xml_to_array($root) {
    $result = array();

    if ($root->hasAttributes()) {
        $attrs = $root->attributes;
        foreach ($attrs as $attr) {
            $result['@attributes'][$attr->name] = $attr->value;
        }
    }

    if ($root->hasChildNodes()) {
        $children = $root->childNodes;
        if ($children->length == 1) {
            $child = $children->item(0);
            if ($child->nodeType == XML_TEXT_NODE) {
                $result['_value'] = $child->nodeValue;
                return count($result) == 1
                    ? $result['_value']
                    : $result;
            }
        }
        $groups = array();
        foreach ($children as $child) {
            if (!isset($result[$child->nodeName])) {
                $result[$child->nodeName] = xml_to_array($child);
            } else {
                if (!isset($groups[$child->nodeName])) {
                    $result[$child->nodeName] = array($result[$child->nodeName]);
                    $groups[$child->nodeName] = 1;
                }
                $result[$child->nodeName][] = xml_to_array($child);
            }
        }
    }

    return $result;
}

测试;

$s = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <response>
            <resData foo="1">
                <contact:infData xmlns:contact="http://example.com/contact-1.0" bar="1">
                    <contact:status s="value1"/>
                    <contact:status s="value2"/>
                    <contact:status s="value3"/>
                    <contact:status s="value4"/>
                </contact:infData>
            </resData>
        </response>';

$xml = new DOMDocument();
$xml->loadXML($s);
$xmlArray = xml_to_array($xml);
print_r($xmlArray);
// print_r($xmlArray['response']['resData']['contact:infData']['contact:status'][0]['@attributes']['s']);
// foreach ($xmlArray['response']['resData']['contact:infData']['contact:status'] as $status) {
    // echo $status['@attributes']['s'] ."\n";
// }

这篇关于什么是最好的 php DOM 2 Array 函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆