2013-01-20 104 views
2

我正在尝试使用SimpleXML检索过程数据,并且有很大困难。我在这里阅读了许多关于这个主题的主题,他们都看起来像我在做什么,但我的工作不正常。下面是我得到了什么:通过SimpleXMLElement循环访问属性

<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-> attributes() - > COMP_ID等等。

我错过了什么?

回答

6

SimpleXML的是一个类似数组的对象。小抄:

  • 前缀的子元素作为数字索引或穿越
    • 不包括前缀的元素(注意,我真的是前缀,不空命名空间SimpleXMLElement处理!的命名空间是一个奇怪的,可以被打破的。)
    • 第一个孩子:$sxe[0]
    • SimpleXMLElement相匹配的元素的子集:$sxe->ROWS$sxe->{'ROWS'}
    • 迭代孩子:foreach ($sxe as $e)$sxe->children()
    • 文本内容:(string) $sxeSimpleXMLElement总是会返回另一个SimpleXMLElement,所以如果你需要一个字符串明确地投它
  • 前缀的子元素
    • $sxe->children('http://example.org')返回一个新SimpleXMLElement在匹配的命名空间的元素 ,命名空间剥离所以你可以使用它在上一节等等。在空命名空间
  • 属性作为关键指标:
    • 特定属性:`$ SXE [ '属性名']
    • 所有属性:$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']; 
} 
+0

宾果。强制数据类型做到了。谢谢。 –

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

+0

这是“如何遍历属性”的答案! –