Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php &引用;在“签名处”在SimpleXML对象中?_Php_Simplexml - Fatal编程技术网

Php &引用;在“签名处”在SimpleXML对象中?

Php &引用;在“签名处”在SimpleXML对象中?,php,simplexml,Php,Simplexml,这是在典型的SimpleXMLElement对象上运行的print\u r()的输出: SimpleXMLElement Object ( [@attributes] => Array ( ) ) @符号是什么意思?这是一个对象。“@attributes”行是XML元素的内部表示形式。使用SimpleXML函数从该对象获取数据,而不是直接与它交互。所有关于错误控制的答案都是错误的。@并不意味着任何东西。这就是属性在内部的调用方式,但是不要依赖于此

这是在典型的SimpleXMLElement对象上运行的
print\u r()
的输出:

SimpleXMLElement Object
(
    [@attributes] => Array
        (

        )
)

@符号是什么意思?

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

所有关于错误控制的答案都是错误的。@并不意味着任何东西。这就是属性在内部的调用方式,但是不要依赖于此。在处理SimpleXML时,不要依赖于
print\u r()
var\u dump()
。SimpleXML做了许多“神奇”的事情,但这些事情并没有被
print\u r()
var\u dump()正确地表示出来


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

对不起,不能作为来宾进行评论,但对于像我一样来到这里的其他人。。。我正在创建自己的Joomla表单字段,Joomla创建了一个非常“有趣”的对象。现在,我不想成为一名SimpleXML专家,我想要的只是原始标签文本,它被隐藏在@attributes中

经过一点
“嗯,我想知道这是否有效?”™我发现这是访问这些值的最简单方法:

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 

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

我正在使用一个只提供XML格式数据的HTTP API。因此,首先我将其加载到SimpleXML中,并且对@attributes问题感到困惑。。如何获取它包含的宝贵数据打印()把我弄糊涂了

我的解决方案是在0处创建一个数组和一个迭代器变量。使用foreach循环SimpleXML对象,使用attributes()方法获取数据,并将其加载到我创建的数组中。在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是整数,并添加了引号以确保名称是字符串。如果没有某种类型的变量转换,则将SimpleXML对象加载到创建的数组中

打印的最终结果\u r()


我不知道为什么。SimpleXML决定命名数组元素,我想是这样。@Rocket我找不到在变量名中包含@的方法。您可以使用
${'@var'}
来创建名称中带有'@'的变量。对于对象,您可以执行
$obj->{'@var'}
。但是,SimpleXMLElements的访问方式不同。阅读答案中的链接。这不是一个“数组”。它也不是“数组元素”。这只是一些内在的东西。此外,它不是“所有属性”。例如,名称空间属性不会出现在此列表中。不要在SimpleXMLElement上使用
print\r()
,它不是合适的工具。@Pete:首先,这个问题中的对象是一个对象。您不直接访问它的属性,而是使用它的方法访问数据。第二,如果
$obj
是一个对象,则不使用
[]
访问它的值,而是使用
->
。第三,
{'@var'}
在处理对象或变量名时是正确的,数组键不需要
{}
。请参阅:。是的,SimpleXMLElement对象似乎很奇怪。您可以在任何时候更改接受的答案时取消选择以前的选择。这有助于网站避免演变成一场巨大的竞赛,在竞赛中,随机的人会发布他们不知道的主题的随机答案,但后来发现他们的随机答案不正确时,会将其删除并编辑。为了更好地替代
print\r
和这种情况下的朋友,请访问github.com/IMSoP/simplexml\u debugNot回答此问题。要读取属性,必须使用类似数组的语法-而不是
name->attribute
,使用
name['attribute']
Array
(
   [0] => Array
    (
        [id] => 1
        [first] => John
        [last] => Smith
    )

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