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

问题描述 投票:0回答:1

对 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
一个包含多个项目
<flat>
<post>
:

<?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] => Array ( [roms] => 4 [baths] => 2 ) )

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

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

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

我知道,它是插件。如果插件看到帖子中只有一个单位,他就会使结果数组变得简单。

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

感谢您的帮助

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;
    }
}

** 感谢您的帮助!**

php arrays xml laravel plugins
1个回答
0
投票

看起来不可能。据我了解,标准 PHP 工具将 XML 转换为数组,从而实现了这一点。基于它们的插件。

无论如何,我认为有一种方法可以通过更改此插件的源代码来解决它,但我在我的情况下解决了,通过处理 XML 到数组转换的结果,并检查结果数组是否有一个或多个

flat

© www.soinside.com 2019 - 2024. All rights reserved.