如何从PHP中的SimpleXMLObject解析值`@ attribute`

时间:2015-06-05 12:08:14

标签: php xml parsing simplexml

我正在尝试解析starkoverflow.com/feeds/tag/{$tagName}。 这是我的代码:

<?php
    $xml = file_get_contents("http://stackoverflow.com/feeds/tag/php");
    $simpleXml = simplexml_load_string($xml);
    $attr = $simpleXml->entry->category->@attributes;

?>

当我执行上面的代码时,它会给我一个错误Parse error: syntax error, unexpected '@', expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in D:\wamp\www\success\protoT.php on line 4

所以,我的问题是如何获得@attributes的阵列?

Scrrenshot

2 个答案:

答案 0 :(得分:2)

您使用appropriately documented method: attributes()

$attr = $simpleXml->entry->category->attributes();

除了$simpleXml->entry->category是一个数组,因此您需要指定要访问的数组中的哪个条目:

$attr = $simpleXml->entry->category[0]->attributes();

修改

除非我刚学会,否则你只需要引用第一个元素

答案 1 :(得分:2)

关键是,要意识到没有 spoon 数组。

要将所有属性作为数组获取,可以使用attributes()方法:

$all_attributes = $simpleXml->entry->category->attributes();

但是,大多数情况下,您真正​​想要的是一个特定属性,在这种情况下,您只需使用数组键表示法:

$id_attribute = $simpleXml->entry->category['id'];

请注意,这会返回一个对象;传递它时,通常只想要表示其值的字符串:

$id_value = (string)$simpleXml->entry->category['id'];

以上假设您始终希望首先 <category>中的第一个 <entry>元素,即使有多个元素。它实际上是指定第0项的简写(即使每个元素只有一个也能工作):

$id_value = (string)$simpleXml->entry[0]->category[0]['id'];

或者,当然,循环遍历每一组(同样,如果有一个或多个,无关紧要,foreach仍然有效):

foreach ( $simpleXml->entry as $entry ) {
    foreach ( $entry->category as $category ) {
        $id_value_for_this_category = (string)$category['id'];
    }
}