关于 mtownsend/request-xml(XML 到数组)插件的问题

Posted

技术标签:

【中文标题】关于 mtownsend/request-xml(XML 到数组)插件的问题【英文标题】:Question amout mtownsend/request-xml (XML to array) plugin 【发布时间】:2021-04-25 12:23:56 【问题描述】:

对 mtownsend/request-xml(XML 到数组)插件有疑问。 因此,插件将 XML 文件转换为数组。 我在我的 Laravel 项目中使用它,有几个原因,因为我需要它,但这里有一个问题。

有两个简单的 XML 文件

第一个文件 oneitem.xml 和一个项目 <flat><post>

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <post>
        <flat>
            <roms>4</roms>
            <baths>2</baths>
        </flat>
    </post>
</data>

第二个文件severalitems.xml 一个包含多个项目&lt;flat&gt;&lt;post&gt;

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <post>
        <flat>
            <roms>4</roms>
            <baths>2</baths>
        </flat>
        <flat>
            <roms>5</roms>
            <baths>1</baths>
        </flat>
        <flat>
            <roms>7</roms>
            <baths>3</baths>
        </flat>
    </post>
</data>

然后,我使用一个简单的代码从这些文件中创建一个数组,并显示每个结果数组:

$xmlone = XmlToArray::convert(file_get_contents('public/xml/test/oneitem.xml'));
$oneflat = $xmlone['post'];
print_r($oneflat);

$xmlseveral = XmlToArray::convert(file_get_contents('public/xml/test/severalitems.xml'));
$severalflats = $xmlseveral['post'];
print_r($severalflats);

如果我们尝试从第一个文件(带有一个flat)创建一个数组,并在posts 中找到我们拥有的所有内容,我们会得到以下结果:

Array ( [flat] =&gt; Array ( [roms] =&gt; 4 [baths] =&gt; 2 ) )

如果我们在第二个文件中做同样的事情(有几个`flat),我们会得到这个结果

Array ( [flat] =&gt; Array ( [0] =&gt; Array ( [roms] =&gt; 4 [baths] =&gt; 2 ) [1] =&gt; Array ( [roms] =&gt; 5 [baths] =&gt; 1 ) [2] =&gt; Array ( [roms] =&gt; 7 [baths] =&gt; 3 ) )

所以,如果我们有多个项目,插件会添加一个带有键的附加数组,[0]、[1]、[2].... 我需要做同样的事情,即使只有一个项目平放在帖子中。所以结果具有相同的格式。

我知道,它可以制作插件。如果 plugin 看到 post 中只有一个 flat,他会简化结果数组。

插件的主文件的代码在这里,但是我看不懂,是哪几行做的...

感谢您的帮助

public static function convert($xml, $outputRoot = false)
    
        $array = self::xmlStringToArray($xml);
        if (!$outputRoot && array_key_exists('@root', $array)) 
            unset($array['@root']);
        
        return $array;
    

    protected static function xmlStringToArray($xmlstr)
    
        $doc = new DOMDocument();
        $doc->loadXML($xmlstr);
        $root = $doc->documentElement;
        $output = self::domNodeToArray($root);
        $output['@root'] = $root->tagName;
        return $output;
    

    protected static function domNodeToArray($node)
    
        $output = [];
        switch ($node->nodeType) 
            case XML_CDATA_SECTION_NODE:
            case XML_TEXT_NODE:
                $output = trim($node->textContent);
                break;
            case XML_ELEMENT_NODE:
                for ($i = 0, $m = $node->childNodes->length; $i < $m; $i++) 
                    $child = $node->childNodes->item($i);
                    $v = self::domNodeToArray($child);
                    if (isset($child->tagName)) 
                        $t = $child->tagName;
                        if (!isset($output[$t])) 
                            $output[$t] = [];
                        
                        $output[$t][] = $v;
                     elseif ($v || $v === '0') 
                        $output = (string) $v;
                    
                
                if ($node->attributes->length && !is_array($output))  // Has attributes but isn't an array
                    $output = ['@content' => $output]; // Change output into an array.

                
                if (is_array($output)) 
                    if ($node->attributes->length) 
                        $a = [];
                        foreach ($node->attributes as $attrName => $attrNode) 
                            $a[$attrName] = (string) $attrNode->value;


                        
                        $output['@attributes'] = $a;

                    
                    foreach ($output as $t => $v) 

                        if (is_array($v) && count($v) == 1 && $t != '@attributes') 
                            $output[$t] = $v[0];
                        
                    
                
                break;
        
        return $output;
    

** 感谢您的帮助!**

【问题讨论】:

【参考方案1】:

看起来不可能。据我了解,将 XML 转换为数组的标准 php 工具可以做到这一点。基于它们的插件。 无论如何,我认为有一种方法可以通过更改此插件的源代码来解决它,但我解决了我的情况,通过处理 XML 到数组转换的结果,并检查结果数组是否有一个 flat 或多个。

【讨论】:

以上是关于关于 mtownsend/request-xml(XML 到数组)插件的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于数学,关于年少的感动,关于初心

scrapy 关于 rule, 关于多页

JS学习笔记关于选项卡,关于this,关于innerHTML

关于唯典冰淇淋新闻页的布局

关于prototype.js的一些技术说明

主页链接发送到关于/关于页面无法回家