首页 > 解决方案 > 使用 Symfony 的 DomCrawler 组件解析 XML 文档的递归函数

问题描述

我使用 Symfony 5.2 & DomCrawler 组件

我有这样的 XML 文件:

<product>
   <ref>32332</ref>
   <name>Test 1</name>
   <features>
       <feature>
           <name>Feature 1</name>
           <value>Red</value>
       </feature>
       <feature>
           <name>Feature 2</name>
           <value>Large</value>
       </feature>
   </features>
</product>

我想得到一个像这样的数组:

$array = [
    'ref' => 32332,
    'name' => 'Test 1',
    'features' => [
        [
            'name' => 'Feature 1',
            'value' => 'Red',
        ],
        [
            'name' => 'Feature 2',
            'value' => 'Large',
        ]
     ]
];

我想要一种递归函数,我做了这个:

/**
 * @param DOMElement $child
 * @param $array
 * @return mixed
 */
public static function recursiveNode(DOMElement $child)
{
    if ($child->hasChildNodes()) {
        foreach ($child->childNodes as $childNode) {
            if ($childNode->hasChildNodes()) {
                $array [] = Xml::recursiveNode($childNode);
            } else {
                $array [$childNode->nodeName] = $childNode->nodeValue;
            }
        }
    } else {
        $array [$child->nodeName] = $child->nodeValue;
    }

    return $array;
}

我是这样打电话的:

$products = $crawler->filterXPath('PRODUCTS/PRODUCT');
foreach ($products as $product) {
    /** @var DOMElement $child */
    foreach ($product->childNodes as $child) {
        $output = Xml::recursiveNode($child);
    }
}

但它显然不起作用,我有一个数组数组......我怎样才能制作这个数组?

标签: phpsymfony

解决方案


PHP 函数simplexml_load_string()将 XML 加载到一个类型的对象中SimpleXMLElement,然后可以查询该类型的值,这与检查对象的属性的方式非常相似。

如果您需要普通数组中的数据,那么可以使用一个简单的技巧来完成:将 JSON 编码SimplXMLElement为 JSON,然后将 JSON 解码回一个简单的数据结构,并true作为第二个参数传递json_decode()给获取数组,而不是对象:

$xml = <<< END
<product>
   <ref>32332</ref>
   <name>Test 1</name>
   <features>
       <feature>
           <name>Feature 1</name>
           <value>Red</value>
       </feature>
       <feature>
           <name>Feature 2</name>
           <value>Large</value>
       </feature>
   </features>
</product>
END;

$xmlObject = simplexml_load_string($xml);
$array = json_decode(json_encode($object), true));

上网查一下


推荐阅读