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