Я хочу разбирать xml-файлы. Лучшим способом, который я нашел, является использование класса DOMDocument ().
sample xml string:
<?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? 🙁 Спасибо
Вы можете использовать это (на основе: 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"; // }