XML:啥是“@attributes”节点[重复]
Posted
技术标签:
【中文标题】XML:啥是“@attributes”节点[重复]【英文标题】:XML: what is the "@attributes" node [duplicate]XML:什么是“@attributes”节点[重复] 【发布时间】:2013-07-29 13:23:51 【问题描述】:我有一个具有以下节点的 SimpleXML 对象,@attributes
。这是simplexml_load_string()
从 USPS 获得的 XML 字符串的结果。
$xml =
SimpleXMLElement Object
(
[@attributes] => Array
(
[CLASSID] => 3
)
[MailService] => Priority Mail Express 1-Day
[Rate] => 19.10
)
我知道您可以执行以下操作
$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
有什么特别的原因,你为什么要@attributes
为CLASSID
?为什么不将CLASSID
与MailService
或Rate
相同?
【问题讨论】:
对不起,我澄清了我的问题。我不是在问如何访问它。我在询问 XML 对象结构背后的原因。如有必要,请删除。 XML 的格式不是我们能回答的,你得问 USPS。 ^,好的,这是真的。我注意到 USPS 处理数据的方式很奇怪。 如果您查看前面问题的答案,您应该会发现这正是 SimpleXML 在var_dump
输出 中表示 XML 属性的方式。实际对象中没有@attributes
,您无需担心。
您的最后一个示例表明您尚未阅读其他问题的答案。您确实不需要需要转换为数组并查找['@attributes']
,您只需键入echo $xml['CLASSID'];
。见the "basic usage" in the manual。
【参考方案1】:
节点的属性与其他节点/子节点的处理方式不同。 @attributes
是指向属性内部表示的链接。
要访问属性,请使用类似
echo $xml->attributes['CLASSID']
正如 IMSop 在下面的 cmets 中指出的,访问属性的更好方法是使用数组表示法。例如,
echo $xml['CLASSID']
【讨论】:
感谢您的回答,所以$xml->attributes()->'CLASSID'
给了我一个值为3
的XML 对象。我正在阅读人们使用强制转换来以可用的形式获得他们想要的价值。所以,像(int)$xml->attributes()->'CLASSID'
得到3
或(array)$xml->attributes()->'CLASSID'
得到Array[0]=>3
。这样合适吗?
是的,这似乎是 php 处理这些情况的方式。 PHP 是动态转换,所以它应该在运行中进行,但它可能有 xml 数据或其他问题。
现在已经足够好了! (但似乎 ppl 访问此值的方式有多种变体 - 有些比其他的更长更丑)
这不是真的 - @attributes
只是 SimpleXML 显示 XML 元素的属性 当使用print_r
、var_dump
输出时的方式等。该对象具有$node->tag
(访问子元素)和$node['attr']
(访问属性)的“重载”功能。内部对象不是普通的 PHP 对象,将其视为一个对象会误导您。
@Youn 关于强制转换,这通常是必要的,以避免混淆期望实际字符串或 int 的代码; echo $xml['CLASSID'];
可以正常工作,但是如果您传递 $xml['CLASSID']
,它仍然是链接到原始 XML 文档的对象,这可能是不可取的(例如,它不能通过 serialize()
运行,或者保存在会话中)。因此,$class_id = (string)$xml['CLASSID']
或 $class_id = (int)$xml['CLASSID']
通常更安全。以上是关于XML:啥是“@attributes”节点[重复]的主要内容,如果未能解决你的问题,请参考以下文章