php - 使用 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);
}
}
但它显然不起作用,我有一个数组数组......我怎样才能制作这个数组?
解决方案
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));
上网查一下