当前位置: 首页 > 知识库问答 >
问题:

php DOM 2 Array函数最好的是什么?

韩征
2023-03-14

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

示例xml字符串:

<?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个元素(仅值4)

<?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元素并将它们发送到数组?

输出数组:

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

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

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

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

                            )

                    )

            )

    )

)

其中value1,value2,value3?:(谢谢你

共有1个答案

公孙阳文
2023-03-14

您可以使用它(基于: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";
// }
 类似资料:
  • 问题内容: 哪个AJAX库最适合Django,为什么? 寻找一个包含大量教程,书籍和详细文档的数据库。 哪一个是最容易使用的?哪一个处于早期开发阶段,但对未来显示出巨大的希望? 问候, 克里斯 问题答案: 我强烈推荐jQuery。有一些有关如何实现它的教程。 http://lethain.com/entry/2007/dec/11/two-faced-django-part-5-jquery- a

  • 问题内容: 寻找JavaScript 中 阶乘 函数的真正快速实现。有什么建议吗? 问题答案: 您可以[搜索(1 …100)!在WolframAlpha上预先计算阶乘序列。 前100个数字是: 如果仍要自己计算值,则可以使用备忘录: 编辑:21.08.2014 解决方案2 我认为添加一个 懒惰的* 迭代 阶乘函数 的工作示例将很有用,该 函数 使用 大数 来获得带有 备忘录的 准确 结果,并将 缓

  • 问题内容: 是的,我知道Ajax是一个愚蠢的名词,但是我需要一个像样的详尽教程。谁能指出我最好的一个? 问题答案: W3schools总是帮助我。 http://www.w3schools.com/Ajax/Default.Asp

  • 本文向大家介绍为什么Ember.js是最好的javascript框架?,包括了为什么Ember.js是最好的javascript框架?的使用技巧和注意事项,需要的朋友参考一下 ember成为javascript顶级Web开发框架之一的原因很多。其中一些原因是- 由于内置了模板解决方案,因此无需编写太多代码。 灰烬的固执己见的体系结构可避免在不重要的决策上浪费时间。 友好的API,使应用程序开发高效

  • 问题内容: 我正在构建一个需要搜索功能的Django项目,直到出现,我必须选择一个搜索应用程序。那么,哪个最好?“最好”是指… 易于安装/设置 具有Django或至少Python友好的API 可以执行相当复杂的搜索 这是我听说过的一些应用程序,如果你知道其中任何一个,请建议其他应用程序: djangosearch django-sphinx 我还想避免使用第三方搜索引擎(例如Google Site

  • 我和JNI有一个Android项目。在实现侦听器类的CPP文件中,有一个回调x()。调用x()函数时,我想调用java类中的另一个函数。然而,为了调用该java函数,我需要访问JNIEnv*。 我知道在回调的同一个cpp文件中,有一个函数: 当