访问 SimpleXML 中的 @attribute
在使用SimpleXML时,我之前经常使用以下的方式来获取属性,但是代码有点长:
$att = $xml->attributes(); echo $att['field'];
它应该更简单,你只需要按照以下格式一次性获取属性:
标准方式 - 通过数组访问属性 (AAA)
$xml['field'];
其他的替代方式有:
正确且快速的格式
$xml->attributes()->{'field'};
错误的格式
$xml->attributes()->field; $xml->{""}->field; $xml->attributes('field'); $xml->attributes()['field']; $xml->attributes()->['field'];
我同意你提到的第一个错误格式,因为我在使用它时会导致页面崩溃——然而有多个人声称这种方式是有效的。有没有关于这个的解释或细微差别呢?
"错误的格式"是可以工作的。我一直使用第一个例子。为什么它是错误的呢?
从技术上讲,$xml->attributes()->{'field'}
、$xml->attributes()->field
和$f='field'; $xml->attributes()->$f;
是相同的。我看不出为什么其中一种是正确的格式而另一种是错误的。
$xml->attributes()->{'field'}
是正确的,因为它可以安全地用于属性名称中含有特殊字符的情况(例如"data-attr")。$xml->attributes()->field
只适用于属性名称是单个字母数字的情况。
在使用这两种正确的选项时,我得到的是SimpleXMLElement对象。
为了获取字符串而不是SimpleXMLElement对象,我不得不显式地进行类型转换,使用(string) $xml->attributes()['attr']
。
问题出现的原因是在通过attributes()函数获取XML元素的属性时,返回的属性值是一个SimpleXMLElement对象,而不是一个字符串。因此,使用print_r和var_dump函数输出属性值时会得到奇怪的结果。
解决方法是将属性值强制转换为字符串。可以使用"".$b的方式将SimpleXMLElement对象转换为字符串,并保持其作为字符串的形式。
以下是完整的
在SimpleXML中,通过调用XML节点上的attributes()函数可以获取XML元素的属性。可以使用var_dump函数来打印该函数的返回值。
在php.net上可以找到更多信息:http://php.net/simplexmlelement.attributes
以下是该页面上的示例代码:
$xml = simplexml_load_string($string); foreach($xml->foo[0]->attributes() as $a => $b) { echo $a,'="',$b,"\"\n"; }
有趣的是,$b将是一个SimpleXMLElement对象,因此使用print_r和var_dump函数输出属性值时会得到奇怪的结果。为了解决这个问题,可以将其强制转换为字符串(或其他需要的类型)。
使用"".$b的方式可以将SimpleXMLElement对象转换为字符串,并保持其作为字符串的形式。
问题的原因是用户想要从SimpleXML对象中访问属性,但是他们不确定如何正确地进行访问。
解决方法是使用以下格式来访问属性:$xml->tag->attributes()->attr。其中,$xml是XML对象,tag是XML中的标签,attr是要访问的属性。
用户之所以认为这种访问属性的方式是错误的,可能是因为他们没有在正确的XML对象上调用attributes()方法。他们需要在与XML中正确标签对应的对象上调用attributes()方法才能成功访问属性。
还有一个用户遇到的问题是他们无法获取属性值,而是得到了一个包含0="2001"的SimpleXMLElement对象。这是因为他们没有正确地使用属性访问方法。正确的方法是在属性访问方法后面加上[0],如:$xml->Policy->CommlPolicy->CommlCoverage[0]->attributes()->id[0]。
另一个用户询问为什么这个答案不是被选择的答案。这可能是因为他们在寻找一个更准确的答案,而不是只是简单地访问属性。他们可以通过阅读相关文章来找到解决方案,并使用current($xml->attributes(current($xml->getNamespaces(true)))->noNamespaceSchemaLocation)
来具体获取模式属性。
以上就是用户在访问SimpleXML对象的属性时遇到的问题的原因和解决方法。