这是我的代码:
$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]而不是整个数组?我不明白。
答案 0 :(得分:6)
@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
)
)
如果你只想要lolelem的话,你需要做什么:
$xml->xpath("//lol/lolelem")
这给出了这个结果(不是预期的形状,但包含正确的元素)
Array
(
[0] => SimpleXMLElement Object
(
[0] => Lol1
)
[1] => SimpleXMLElement Object
(
[0] => Lol2
)
)
答案 1 :(得分:5)
这是因为你有两个lol元素。要访问第二个,您需要执行此操作:
$xml->testing->lol[1];
这会给你“那里”
$xml->testing->lol[0];
会给你“你好”
SimpleXMLElement的children()方法将为您提供一个包含元素所有子元素的对象,例如:
$xml->testing->children();
将为您提供一个对象,其中包含“testing”SimpleXMLElement的所有子项。
如果需要迭代,可以使用以下代码:
foreach($xml->testing->children() as $ele)
{
var_dump($ele);
}
这里有关于SimpleXMLElement的更多信息:
答案 2 :(得分:1)
您可能想要做的是使用Json编码/解码
$jsonArray = Json_decode(Json_encode($xml), true);
使用true参数,您可以调用而不是使用 - &gt;使用[姓名]
所以一个例子是:
$xml = file("someXmlFile.xml");
$jsonArray = Json_decode(Json_encode($xml), true);
foreach(jsonArray['title'] as $title){
Do something with $titles
}
如果你有多个元素,如果元素有属性,它通常会放在@attributes中。这可以通过使用:$title = $title['@attributes']
希望它可以提供帮助。
答案 3 :(得分:1)
啊,是的,我记得简单的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);
?>
答案 4 :(得分:0)
进入这个问题......
Xpath可能有点慢,因此您可以通过简单的for循环实现相同的效果。
for ($i = 0; $i < count($xml->testing->lol); $i++) {
print_r($xml->testing->lol[$i]);
}