在SimpleXML对象中的“符号”@?

时间:2010-12-01 18:45:52

标签: php simplexml

这是在典型的SimpleXMLElement对象上运行的print_r()的输出:

SimpleXMLElement Object
(
    [@attributes] => Array
        (

        )
)

@符号是什么意思?

5 个答案:

答案 0 :(得分:12)

这是一个SimpleXMLElement对象。 '@attributes'行是XML元素中attributes的内部表示。使用SimpleXML的函数从这个对象获取数据,而不是直接与它进行交互。

答案 1 :(得分:9)

关于错误控制的所有答案都是错误的。 @并不代表任何。这就是内部调用属性的方式,但不依赖于此。在处理SimpleXML时,不要依赖print_r()var_dump()。 SimpleXML执行了许多print_r()var_dump()未正确表示的“神奇”事物。

如果你需要知道XML片段的“内部”,只需在其上使用->asXML()

答案 2 :(得分:1)

很抱歉,不能作为嘉宾发表评论,但对于像我一样在这里结束的其他人...我正在创建自己的Joomla表单字段,而Joomla创建了一个非常“有趣”的各种各样的对象。现在,我不想成为SimpleXML专家,我想要的只是原始标签文本,它在@attributes中被遗忘。

经过一点"hmmm, I wonder if this works?"™后,我发现这是访问这些值的最简单方法:

var_dump($simpleXMLObject);

/* Result */
object(SimpleXMLElement)
  public '@attributes' => 
    array (size=3)
      'name' => string 'awesome'
      'label' => string 'Awesome Label'
      'type' => string 'typeOfAwesome'

echo $simpleXMLObject->attributes()->label; // Awesome Label

$simpleXMLObject->attributes()->label = 'Different Day, Different Awesome';
echo $simpleXMLObject->attributes()->label; // Different Day, Different Awesome 

他们没有撒谎。这很简单。

答案 3 :(得分:0)

我没有足够的代表对user3098738发表评论......但想要验证他的回复。它真的很简单。任何时候你在SimpleXML中运行@attributes ...使用

$simpleXMLObject->attributes()
$simpleXMLObject->key->attributes()

答案 4 :(得分:0)

我正在使用HTTP API,它只提供XML格式的数据。所以首先我将它加载到SimpleXML中,并且也被@attributes问题弄糊涂了......我如何获得它包含的宝贵数据? print_r()让我感到困惑。

我的解决方案是在0处创建数组迭代器变量。使用foreach循环使用SimpleXML对象并使用attribues()方法获取数据将其加载到我创建的数组中。在foreach循环结束之前迭代。

所以print_r()来自于显示:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [ID] => 1
            [First] => John
            [Last] => Smith
        )
)

更加可用的普通数组。这很好,因为我想要在需要时快速将数组转换为json的选项。

我的代码解决方案:

$obj = simplexml_load_string($apiXmlData);
$fugly = $obj->Deeply->Nested->XML->Data->Names;
$people = array();
$i = 0;
foreach($fugly as $val)
{
  $people[$i]['id'] += $val->attributes()->ID;
  $people[$i]['first'] = "". $val->attributes()->First;
  $people[$i]['last'] = "". $val->attributes()->Last;
  $i++;
}

快速说明PHP的settype()函数很奇怪/错误,所以我添加 + 以确保ID是整数并添加了引号以确保名称为 string 。如果没有某种变量转换,您将把SimpleXML对象加载到您创建的数组中。

print_r()的最终结果:

Array
(
   [0] => Array
    (
        [id] => 1
        [first] => John
        [last] => Smith
    )

   [1] => Array
    (
        [id] => 2
        [first] => Jane
        [last] => Doe
    )
)