我正在尝试使用SimpleXML检索过程数据并且遇到了很大困难。我在这里读过很多关于这个主题的帖子,它们都像我在做的那样,但是我的工作并没有。这就是我所拥有的:
<ROOT>
<ROWS COMP_ID="165462">
<ROWS COMP_ID="165463">
</ROOT>
我的代码:
$xml = simplexml_load_file('10.xml');
foreach( $xml->ROWS as $comp_row ) {
$id = $comp_row->COMP_ID;
}
当我在调试器中逐步执行此操作时,我可以看到$ id未设置为COMP_ID的字符串值,而是成为包含CLASSNAME对象的SimpleXMLElement本身。我尝试了很多解决这个属性的变体但没有工作,包括$ comp_row-&gt; attributes() - &gt; COMP_ID等。
我错过了什么?
答案 0 :(得分:6)
SimpleXML是一个类似于数组的对象。备忘单:
SimpleXMLElement
处理命名空间是一个奇怪的,可以说是破碎的。)$sxe[0]
SimpleXMLElement
:$sxe->ROWS
,$sxe->{'ROWS'}
foreach ($sxe as $e)
,$sxe->children()
(string) $sxe
。 SimpleXMLElement
始终会返回另一个SimpleXMLElement
,因此如果您需要字符串明确地将其强制转换!$sxe->children('http://example.org')
返回包含元素的新SimpleXMLElement
在匹配的命名空间中,带有名称空间被剥离,因此您可以像上一节一样使用它。$sxe->attributes()
$sxe->attributes()
会返回一个特殊的SimpleXMLElement
,其中显示的属性为两个子元素和属性,因此以下工作都是:$sxe->attributes()->COMP_ID
$a = $sxe->attributes(); $a['COMP_ID'];
(string) $sxe['attr-name']
$sxe->attributes('http://example.org')
$sxe_attrs = $sxe->attributes('http://example.org'); $sxe_attrs['attr-name-without-prefix']
你想要的是:
$xml = '<ROOT><ROWS COMP_ID="165462"/><ROWS COMP_ID="165463"/></ROOT>';
$sxe = simplexml_load_string($xml);
foreach($sxe->ROWS as $row) {
$id = (string) $row['COMP_ID'];
}
答案 1 :(得分:1)
你错过了......
foreach( $xml->ROWS as $comp_row ) {
foreach ($comp_row->attributes() as $attKey => $attValue) {
// i.e., on first iteration: $attKey = 'COMP_ID', $attValue = '165462'
}
}