为什么SimpleXML在我使用它时将我的数组更改为数组的第一个元素?

时间:2011-07-22 22:35:00

标签: php arrays object simplexml

这是我的代码:

$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]而不是整个数组?我不明白。

5 个答案:

答案 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的更多信息:

http://www.php.net/manual/en/class.simplexmlelement.php

答案 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]);
}