Ну, у меня возникли проблемы с изменением xml в массив … Было бы просто, если бы каждый xml выполнял один и тот же формат, но каждый XML отличается, за исключением <Formula>
, formulaname и movepeed ex:
<Formula> <formulaname>Basic</formulaname> <movespeed>1</movespeed> <str>4</str> <dex>3</dex> <int>1</int> <will>2</will> </Formula>
или
<Formula> <formulaname>Basic</formulaname> <movespeed>1</movespeed> <box>4</box> <chicken>3</chicken> <ducks>1</ducks> <cereal>2</cereal> </Formula>
То, что я пробовал:
$xml = simplexml_load_file("test.xml"); print_r($xml);
Это на самом деле prints
что-то, но я не мог пройти мимо этого или даже echo
его.
foreach($xml->text as $string) { print_r($string); echo 'attributes: '. $string->attributes() .'<br />'; }
Не работает, изначально это для strings
но ни одна из них не является strings
…
foreach ($xml->Formula as $element) { foreach($element as $key => $val) { echo "{$key}: {$val}"; }
Не работал, мне нужно было что-то вроде этого работать, поэтому я могу использовать значения из array
не зная, как именно будет вызываться значение.
Вы не можете получить доступ к детям, используя foreach на самом узле, вам нужно использовать .children()
:
$s =<<<EOS <root> <Formula> <formulaname>Basic</formulaname> <movespeed>1</movespeed> <box>4</box> <chicken>3</chicken> <ducks>1</ducks> <cereal>2</cereal> </Formula> </root> EOS; $xml = simplexml_load_string($s); foreach ($xml->Formula as $element) { foreach($element->children() as $key => $val) { echo "{$key}: {$val}"; } }
Это ваш лучший выбор, и он должен устранить все объекты SimpleXMLElement и вместо этого дать вам ничего, кроме массивов:
$xml = simplexml_load_file("test.xml"); $xml_array = unserialize(serialize(json_decode(json_encode((array) $xml), 1))); print_r($xml_array);
Делает разницу между этим:
И это:
Надеюсь, это поможет… 🙂
для вашего примера этого кода достаточно:
$xml = simplexml_load_file('formula.xml'); $arr = (array) $xml; var_dump($arr);
и ваш xml переходит в массив
formula.xml содержит ваш xml
Если у вас есть cdata и атрибуты в одном узле, использование вышеперечисленных методов будет опускать атрибуты.
попробуйте использовать этот метод:
function xml2array($xmlObject, $out = []) { foreach($xmlObject->attributes() as $attr => $val) $out['@attributes'][$attr] = (string)$val; $has_childs = false; foreach($xmlObject as $index => $node) { $has_childs = true; $out[$index][] = xml2array($node); } if (!$has_childs && $val = (string)$xmlObject) $out['@value'] = $val; foreach ($out as $key => $vals) { if (is_array($vals) && count($vals) === 1 && array_key_exists(0, $vals)) $out[$key] = $vals[0]; } return $out; } $xml = simplexml_load_string($xml_string, 'SimpleXMLElement', LIBXML_NOCDATA); $arr = xml2array($xml);