通过SimpleXMLElement循环访问属性

时间:2013-01-20 01:44:33

标签: php xml simplexml

我正在尝试使用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等。

我错过了什么?

2 个答案:

答案 0 :(得分:6)

SimpleXML是一个类似于数组的对象。备忘单:

  • 未加扩展的子元素,如数字索引或可遍历
    • 不包含前缀元素(注意,我的意思是前缀,而不是 null-namespace SimpleXMLElement处理命名空间是一个奇怪的,可以说是破碎的。)
    • 第一个孩子:$sxe[0]
    • 包含匹配元素子集的新SimpleXMLElement$sxe->ROWS$sxe->{'ROWS'}
    • 迭代孩子:foreach ($sxe as $e)$sxe->children()
    • 文字内容:(string) $sxeSimpleXMLElement始终会返回另一个SimpleXMLElement,因此如果您需要字符串明确地将其强制转换
  • 带前缀的子元素
    • $sxe->children('http://example.org')返回包含元素的新SimpleXMLElement 在匹配的命名空间中,带有名称空间被剥离,因此您可以像上一节一样使用它。
  • null namespace中的属性作为键索引:
    • 特定属性:`$ sxe ['attribute-name']
    • 所有属性:$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'
    }
}

PHP Manual: SimpleXMLElement::attributes