2012-09-14 101 views
5

我有下面的XML文檔在這裏: 編輯:(參見下面的示例)PHP SimpleXML的屬性丟失

我使用PHP/SimpleXML來它隱蔽的一個對象來閱讀:

$xmlContent = file_get_contents($path . '/test.xml'); 
$tablesRaw = new SimpleXMLElement($xmlContent); 
echo '<pre>'; 
print_r($tablesRaw); 
echo '</pre>'; 

當我print_r我看到字段的屬性,但可接受值的屬性不顯示。這裏是原始XML(我需要的價值屬性)的例子:

<acceptable-value value="0"> 
    Unknown 
</acceptable-value> 

這是我看到的時候我的print_r:

[acceptable-values] => SimpleXMLElement Object 
              (
               [acceptable-value] => Array 
                (
                 [0] => 
        Unknown 

                 [1] => 
        Invalid 

                 [2] => 
        Deleted 

                 [3] => 
        Valid/Good 

                 [4] => 
        Inactive 

                ) 

              ) 

任何線索,爲什麼屬性沒有顯示?提前致謝。

編輯:請給一些XML的:

<field name="Address1Type" type="String"/> 
<field name="Address2Street1" type="String"/> 
<field name="Address2Street2" type="String"/> 
<field name="Address2Type" type="String"/> 
<field name="Address3Street1" type="String"/> 
<field name="Status" type="Integer" access="R"> 
      <acceptable-values> 
       <acceptable-value value="0"> 
        Unknown 
       </acceptable-value> 
       <acceptable-value value="1"> 
        Invalid 
       </acceptable-value> 
       <acceptable-value value="2"> 
        Deleted 
       </acceptable-value> 
       <acceptable-value value="3"> 
        Valid/Good 
       </acceptable-value> 
       <acceptable-value value="4"> 
        Inactive 
       </acceptable-value> 
      </acceptable-values> 
     </field> 
+0

你會複製/粘貼一些原始的xml代碼,所以我不必下載它? – Norse

+0

是的,試圖讓一些顯示 – joshmmo

+1

那裏我們現在去顯示 – joshmmo

回答

7

這裏的簡單答案是不要使用print_r()與SimpleXML對象。因爲它們是非PHP數據的包裝器,所以通常會顯示「整個」對象的函數並不真正反映您正在查看的內容。

使用SimpleXML訪問屬性的方法是使用屬性名稱,就像它是一個數組鍵($node['attribute']);這是而不是意味着有一個數組在某處與該密鑰,這是一個僞裝的函數調用。

如果您想在編寫SimpleXML代碼時感受您正在查看的節點,請查看我寫的this simplexml_dump() function(反饋歡迎)。

+0

不知道如果我做錯了什麼,但它看起來不適合我,你可以在這裏看到我的代碼/輸出http://i46.tinypic.com/wnqti.jpg – joshmmo

+0

@joshmmo道歉,我傾向於跑帶有Notices的PHP被壓制,因爲他們經常抱怨我很滿意的事情。當我下一次登錄到我的開發箱時,我會更新該函數不會提出該通知。然而,輸出結果與預期的一樣 - 它不會嘗試緩衝整個結構,只是告訴您當前節點被稱爲「表」幷包含57個名爲「table」的子節點。'simplexml_dump($ tablesRaw-> children())'顯示更有用的東西,或者確實是'simplexml_dump($ tablesRaw-> table [22] - > fields-> field [31] - > {'acceptable-values'} - >兒童())' – IMSoP

+0

非常好,我喜歡它。如果它可以擴大整個對象的話,這將是很好的,所以我可以一次看到它。 – joshmmo

0

首先,你必須得到SimpleXMLElement對象。在這種情況下:

$xmlContent = file_get_contents($path . '/test.xml'); 
$tablesRaw = new SimpleXMLElement($xmlContent); 
$elements = $tablesRaw->table[22]->fields->field[31]->{'acceptable-values'}->children(); 

現在,你可以遍歷每個acceptable-value對象,並使用attributes()方法:

foreach($elements as $element) { 
    echo $element->attributes()->value . " "; 
    echo trim($element[0]) . "\n"; 
} 

有了您的XML,將打印:

0 Unknown 
1 Invalid 
2 Deleted 
3 Valid/Good 
4 Inactive 

一點也沒有不依賴數組索引,因爲對attributes()的調用獲取元素的實際屬性。並且->value獲取名稱爲「value」的屬性。