2013-01-20 136 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

這是「如何遍歷屬性」的答案! –