2009-06-14 23 views
30

Trong tài liệu XML, tôi có các phần tử có cùng tên, nhưng giá trị của thuộc tính xác định loại dữ liệu đó là gì và tôi muốn chọn tất cả các phần tử đó có một giá trị nhất định từ tài liệu. Tôi có cần phải sử dụng XPath (và nếu như vậy, bạn có thể đề xuất cú pháp đúng) hoặc là có một giải pháp thanh lịch hơn?SimpleXML: Chọn các phần tử có giá trị thuộc tính nhất định

Dưới đây là một số ví dụ XML:

<object> 
    <data type="me">myname</data> 
    <data type="you">yourname</data> 
    <data type="me">myothername</data> 
</object> 

Và tôi muốn để chọn nội dung của tất cả các <data> thẻ con của <object> người là loại là me.

PS - Tôi đang cố gắng giao tiếp với API Netflix bằng PHP - điều này không quan trọng đối với câu hỏi của tôi, nhưng nếu bạn muốn đề xuất cách tốt/tốt hơn để làm như vậy, tôi là tất cả các tai.

+0

X-Ref: [Thực hiện trạng trong XPath] (http://stackoverflow.com/q/3448005/367456) – hakre

Trả lời

44

Hãy thử XPath này:

/object/data[@type="me"] 

Vì vậy:

$myDataObjects = $simplexml->xpath('/object/data[@type="me"]'); 

Và nếu object không phải là thư mục gốc của tài liệu của bạn, sử dụng //object/data[@type="me"] để thay thế.

+4

cảm ơn bạn đã bao gồm cả dòng gói php đầy đủ và không chỉ là chuỗi xpath. Bạn không bao giờ có thể nói về những thứ như liệu nó đòi hỏi dấu ngoặc kép và các nội dung khác như vậy về phạm vi giống như chuỗi xpath. Xem mọi thứ trong ngữ cảnh cung cấp thông tin quan trọng mà bạn không thể đoán được nếu bạn chưa biết. – ahnbizcad

4

Tôi vừa tạo một chức năng để thực hiện việc này cho tôi; nó chỉ lấy kết quả đầu tiên. Số dặm của bạn có thể thay đổi.

function query_attribute($xmlNode, $attr_name, $attr_value) { 
    foreach($xmlNode as $node) { 
    switch($node[$attr_name]) { 
     case $attr_value: 
     return $node; 
    } 
    } 
} 

Cách sử dụng:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name; 

(Đối với XML dưới đây)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root> 
+11

Tại sao không sử dụng XPath Gumbo được đề xuất? Và tại sao sử dụng một công tắc thay vì dễ đọc hơn nếu ($ node [$ attr_name] == $ attr_value) '? – dimo414