Вот мой код:
$string = <<<XML <?xml version='1.0'?> <test> <testing> <lol>hello</lol> <lol>there</lol> </testing> </test> XML; $xml = simplexml_load_string($string); echo "All of the XML:\n"; print_r $xml; echo "\n\nJust the 'lol' array:"; print_r $xml->testing->lol;
Вывод:
All of the XML: SimpleXMLElement Object ( [testing] => SimpleXMLElement Object ( [lol] => Array ( [0] => hello [1] => there ) ) ) Just the 'lol' array: SimpleXMLElement Object ( [0] => hello )
Почему он выводит только [0] вместо всего массива? Я не понимаю.
Это потому, что у вас есть два элемента LOL. Чтобы получить доступ ко второму, вам нужно сделать следующее:
$xml->testing->lol[1];
это даст вам "там"
$xml->testing->lol[0];
Дает вам «привет»
Метод children () элемента SimpleXMLElement даст вам объект, содержащий все дочерние элементы элемента, например:
$xml->testing->children();
предоставит вам объект, содержащий все дочерние элементы «тестирования» SimpleXMLElement.
Если вам нужно выполнить итерацию, вы можете использовать следующий код:
foreach($xml->testing->children() as $ele) { var_dump($ele); }
Более подробная информация о SimpleXMLElement приведена здесь:
То, что предложил @Yottatron, верно, но совсем не так, как показывает этот пример:
если ваш XML будет выглядеть так:
<?xml version='1.0'?> <testing> <lol> <lolelem>Lol1</lolelem> <lolelem>Lol2</lolelem> <notlol>NotLol1</lolelem> <notlol>NotLol1</lolelem> </lol> </testing>
Вывод Simplexml будет:
SimpleXMLElement Object ( [lol] => SimpleXMLElement Object ( [lolelem] => Array ( [0] => Lol1 [1] => Lol2 ) [notlol] => Array ( [0] => NotLol1 [1] => NotLol1 ) ) )
и путем написания
$xml->lol->lolelem
вы ожидаете, что ваш результат будет
Array ( [0] => Lol1 [1] => Lol2 )
но вместо этого вы получите:
SimpleXMLElement Object ( [0] => Lol1 )
и
$xml->lol->children()
вы получите:
SimpleXMLElement Object ( [lolelem] => Array ( [0] => Lol1 [1] => Lol2 ) [notlol] => Array ( [0] => NotLol1 [1] => NotLol1 ) )
Что вам нужно сделать, если вы хотите только лолелема:
$xml->xpath("//lol/lolelem")
Это дает этот результат (не как ожидаемая форма, но содержит правильные элементы)
Array ( [0] => SimpleXMLElement Object ( [0] => Lol1 ) [1] => SimpleXMLElement Object ( [0] => Lol2 ) )
то, что вы можете сделать, это использовать кодирование / декодирование Json
$jsonArray = Json_decode(Json_encode($xml), true);
С помощью истинного аргумента вы можете вызывать вместо использования -> use [name]
поэтому примером может служить:
$xml = file("someXmlFile.xml"); $jsonArray = Json_decode(Json_encode($xml), true); foreach(jsonArray['title'] as $title){ Do something with $titles }
если у вас более одного элемента, это типично помещается в @attributes, если элементы имеют атрибуты. Этому можно противопоставить: $title = $title['@attributes']
Надеюсь, это поможет.
Ах, да, я помню, как простой XML почти справился с этой проблемой массивов синтаксического анализа. Попробуйте приведенный ниже код. Он предоставит вам массив элементов LOL или, если вы только что получили один элемент LOL, он вернет это в массив.
Главным преимуществом этого является то, что вы можете сделать что-то вроде foreach ($ lol as $ element), и оно все равно будет работать на одном (или на 0) элементе LOL.
<?php $string = <<<XML <?xml version='1.0'?> <test> <testing> <lol>hello</lol> <lol>there</lol> </testing> </test> XML; $xml = simplexml_load_string($string); echo "<pre>"; echo "All of the XML:\n"; print_r($xml); echo "\n\nJust the 'lol' array:\n"; $test_lols = $xml->testing->children(); $childcount = count($test_lols); if ($childcount < 2) { $lol = array($test_lols->lol); } else { $lol = (array) $test_lols; $lol = $lol['lol']; } print_r($lol); ?>
Иди в этот вопрос …
Xpath может быть немного медленным, поэтому вы можете добиться такого же эффекта с помощью простого цикла.
for ($i = 0; $i < count($xml->testing->lol); $i++) { print_r($xml->testing->lol[$i]); }