如何在PHP中循环使用SimpleXML对象

时间:2010-05-24 21:26:57

标签: php simplexml

我有一个simpleXml对象,想要从对象中读取数据,我是PHP新手,并不知道如何做到这一点。对象细节如下。

我需要阅读[说明]和[小时]。三江源。

SimpleXMLElement Object (
    [@attributes] => Array (
        [type] => array
    )
    [time-entry] => Array (
        [0] => SimpleXMLElement Object (
            [date] => 2010-01-26
            [description] => TCDM1 data management: sort & upload
            [hours] => 1.0
            [id] => 21753865
            [person-id] => 350501
            [project-id] => 4287373
            [todo-item-id] => SimpleXMLElement Object (
                [@attributes] => Array (
                    [type] => integer
                    [nil] => true
                )
            )
        )
        [1] => SimpleXMLElement Object (
            [date] => 2010-01-27
            [description] => PDCH1: HTML
            [hours] => 0.25
            [id] => 21782012
            [person-id] => 1828493
            [project-id] => 4249185
            [todo-item-id] => SimpleXMLElement Object (
                [@attributes] => Array (
                    [type] => integer
                    [nil] => true
                )
            )
)   )   )

请帮帮我。我尝试了很多东西,但没有正确的语法。

3 个答案:

答案 0 :(得分:10)

如果您能给我们一个屏幕截图或给出行间距和缩进,那么上面的内容真的很难阅读,那会更好一点 如果你有一个对象

$ xml是一个simplexml对象,你可以访问像

这样的元素
$xml->element.

它看起来像是时间输入的一个元素,在这种情况下你会像这样循环:

foreach( $xml->{'time-entry'} as $time_entry ) {
    echo $time_entry->description . "<br />\n";
}

答案 1 :(得分:1)

如果问题print_r中的对象位于$element中,则以下内容将循环显示两个time-entry元素,同时打印出各自的descriptionhours值。

foreach ($element->{'time-entry'} as $entry) {
    $description = (string) $entry->description;
    $hours       = (string) $entry->hours;
    printf("Description: %s\nHours: %s\n\n", $description, $hours);
}

输出类似:

Description: TCDM1 data management: sort & upload NFP SubProducers list
Hours: 1.0

Description: PDCH1: HTML
Hours: 0.25

请注意,time-entry元素名称必须用大括号 1 作为字符串包装,否则$element->time-entry会尝试读取time元素减去一个名为entry的常量的值,这显然不是我们想要的。此外,descriptionhours值被转换为 2 到字符串(否则它们将是SimpleXMLElement类型的对象。)

1。请参阅variable variables 2。见type casting

答案 2 :(得分:0)

对不起我是PHP新手我刚刚开始学习,所以我的概念来自C编程。我可能在这里做过多的工作/编码......但我相信我会被某人大吼大叫并学习。

这将返回一个数组,该数组很好地用于访问所有单独的数据位而无需处理SimpleXMLElement对象:

public $xmlFileInName = 'sample.xml';

public $errorMessage = "Failed to open file: ";

public function actionGetArray()
{
    try {
        $xml = file_exists($this->xmlFileInName) ?
        simplexml_load_file($this->xmlFileInName) :
        exit($this->errorMessage. $this->xmlFileInName);

        $xmlArray=$this->arrayFromSxe ($xml);

        echo var_dump($xmlArray);
    }
    catch(Exception $e) {
        echo $e->getMessage();
    }
}

public function arrayFromSxe($sxe)
{
    $returnArray = array();
    foreach ((array)$sxe as $key=>$value) {
        if(is_array($value) && !$this->is_assoc($value)) {
            $indies = array();
            foreach($value as $secondkey=>$secondvalue)
                $indies[$secondkey] = $this->arrayFromSxe($secondvalue);
            $returnArray[$key] = $indies;
        }
        else {
            if(is_object($value)) {
                $returnArray[$key] = $this->arrayFromSxe($value);
            } else {
                $returnArray[$key] = $value;
            }
        }
    }
    return $returnArray;
}

function is_assoc($array) {
    return (bool)count(array_filter(array_keys($array), 'is_string'));
}

请注意,使用多个xml标记,例如在您的示例中:

[time-entry] => Array (
    [0] => SimpleXMLElement Object (
    ...
    )
    [1] => SimpleXMLElement Object (
    ...
    )

您必须了解XML文件的结构,以便在代码中解决此问题。 这将在调用此行后返回数组:

$xmlArray=$this->arrayFromSxe ($xml);

将有:

[time-entry][0]
[time-entry][1]

因此,您的代码需要知道通过int索引器或在多次出现xml元素的任何情况下迭代所有时间条目。

如果我所说的没有意义,那么忽略它,只需观察并评估代码。

希望这有帮助。