XML: what is the “@attributes” node
我有一个具有以下节点@attributes的SimpleXML对象。这是simplexml_load_string()来自从USPS获得的XML字符串的结果。
1 2 3 4 5 6 7 8 9 10 11 12
| $xml =
SimpleXMLElement Object
(
[@attributes ] => Array
(
[CLASSID ] => 3
)
[MailService ] => Priority Mail Express 1-Day
[Rate ] => 19.10
) |
我知道您可以执行以下操作
1 2 3 4 5
| $temp = $xml->attributes(); // will return object with '@attributes' note
$temp = (array)$temp; // now in array form
echo $temp['@attributes']['CLASSID']; // prints 3
$xml->{'Rate'}; // will return the rate (19.10) as a string |
是否有特定原因,为什么要为CLASSID选择@attributes?为什么不让CLASSID与MailService或Rate相同?
- 对不起,我澄清了我的问题。我不是在问如何访问它。我在问XML对象结构背后的原因。如有必要,请删除。
-
XML的格式不是我们可以回答的,您必须询问USPS。
-
^,好的,是的。我注意到USPS处理数据很奇怪。
-
如果查看先前问题的答案,您应该看到,这就是SimpleXML在var_dump输出中表示XML属性的方式。实际对象中没有@attributes,您无需担心。
-
您的最后一个示例显示您尚未阅读其他问题的答案。您无需强制转换为数组并查找['@attributes'],只需键入echo $xml['CLASSID'];。请参见手册中的"基本用法"。
节点的属性与其他节点/子节点的处理方式不同。 @attributes是属性内部表示的链接。
要访问属性,请使用
1
| echo $xml->attributes['CLASSID'] |
正如IMSop在下面的注释中指出的那样,一种更好的访问属性的方法是使用数组符号。例如,
- 感谢您的回答,因此$xml->attributes()->{'CLASSID'}给了我一个值为3的XML对象。我正在阅读使用强制转换以可用形式获得他们想要的价值的人们。因此,就像(int)$xml->attributes()->{'CLASSID'}获得3或(array)$xml->attributes()->{'CLASSID'}获得Array[0]=>3。这样合适吗
-
是的,这似乎是PHP处理这些情况的方式。 PHP是动态转换,因此它应该即时进行,但是它可能与xml数据有关。
-
现在足够好了! (但似乎ppl访问此值的方式有所不同-比其他方法更长且更难看)
-
这不是真的-@attributes只是SimpleXML用print_r,var_dump等输出时显示XML元素属性的方式。该对象具有$node->tag的" overloaded "功能(访问子元素)和$node['attr'](访问属性)。内部对象不是普通的PHP对象,认为它是一个会误导您的对象。
-
@Youn关于强制转换,这通常是避免混淆期望实际字符串或整数的代码所必需的; echo $xml['CLASSID'];可以正常工作,但是如果您绕过$xml['CLASSID'],则它仍然是链接到原始XML文档的对象,这可能是不可取的(例如,无法通过serialize()运行或保存在会话中) )。因此,$class_id = (string)$xml['CLASSID']或$class_id = (int)$xml['CLASSID']通常更安全。