2012-09-14 33 views
5

Tôi có tài liệu sau xml ở đây: Edit: (xem dưới đây để biết mẫu)php SimpleXML thiếu các thuộc tính

Tôi đang sử dụng php/SimpleXML để bí mật nó vào một đối tượng để đọc nó:

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

Khi tôi in_r tôi thấy các thuộc tính cho trường nhưng thuộc tính cho giá trị chấp nhận được không hiển thị. Dưới đây là một ví dụ về xml thô (Tôi cần thuộc tính giá trị):

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

Đây là những gì tôi thấy khi print_r:

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

                 [1] => 
        Invalid 

                 [2] => 
        Deleted 

                 [3] => 
        Valid/Good 

                 [4] => 
        Inactive 

                ) 

              ) 

Bất kỳ manh mối tại sao các thuộc tính không hiển thị? Cảm ơn trước.

EDIT: Yêu cầu đối với một số 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

Bạn sẽ sao chép/dán một số mã xml gốc, vì vậy tôi không phải tải xuống? – Norse

+0

vâng, cố gắng để có được một số hiển thị – joshmmo

+1

ở đó chúng tôi hiển thị ngay bây giờ – joshmmo

Trả lời

7

Câu trả lời đơn giản ở đây là không sử dụng print_r() với các đối tượng SimpleXML. Bởi vì chúng là các trình bao bọc xung quanh dữ liệu không phải PHP, các hàm giống như thông thường sẽ hiển thị đối tượng "toàn bộ" không thực sự phản ánh những gì bạn đang xem.

Cách truy cập thuộc tính bằng SimpleXML là sử dụng tên thuộc tính như thể đó là khóa mảng ($node['attribute']); điều này không không có nghĩa là có một mảng ở đâu đó với khóa đó, nó là một cuộc gọi chức năng trong ngụy trang.

Nếu bạn muốn có cảm giác về các nút bạn đang xem trong khi viết mã SimpleXML, hãy xem this simplexml_dump() function mà tôi đã viết (phản hồi chào mừng).

+0

Không chắc chắn nếu tôi đang làm điều gì sai trái nhưng có vẻ như nó không hoạt động đối với tôi, bạn có thể thấy mã/đầu ra của tôi ở đây http://i46.tinypic.com/wnqti.jpg – joshmmo

+0

@joshmmo Xin lỗi, tôi có xu hướng chạy PHP với thông báo bị đàn áp, vì họ thường phàn nàn về những điều tôi hài lòng. Tôi sẽ cập nhật các chức năng không phải để nâng cao thông báo đó khi tôi đăng nhập tiếp theo vào hộp dev của tôi. Tuy nhiên đầu ra là như mong đợi - nó không cố gắng recurse thông qua toàn bộ cấu trúc, chỉ cần cho bạn biết rằng nút hiện tại được gọi là 'bảng' và chứa 57 trẻ em được gọi là 'bảng'.'simplexml_dump ($ tablesRaw-> children())' cho thấy một cái gì đó hữu ích hơn, hoặc thực sự 'simplexml_dump ($ tablesRaw-> table [22] -> fields-> field [31] -> {'acceptable-values'} -> children()) ' – IMSoP

+0

rất đẹp tôi thích nó. Nó sẽ tốt đẹp nếu nó có thể mở rộng toàn bộ đối tượng để nói chuyện để tôi có thể nhìn thấy tất cả cùng một lúc. – joshmmo

0

Trước tiên, bạn có để có được những đối tượng SimpleXMLElement. Trong trường hợp này:

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

Bây giờ, bạn có thể duyệt qua từng đối tượng acceptable-value và sử dụng attributes() phương pháp:

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

Với XML của bạn, mà sẽ in:

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

Nó doesn 't dựa vào chỉ mục mảng, bởi vì các cuộc gọi đến attributes() được các thuộc tính thực tế của phần tử. Và ->value nhận thuộc tính có tên "giá trị".

Các vấn đề liên quan