2010-09-05 14 views
7

Tôi có đối tượng kết quả SimpleXML này:Kiểm tra xem nút xml tồn tại trong PHP

object(SimpleXMLElement)#207 (2) { 
    ["@attributes"]=> 
    array(1) { 
    ["version"]=> 
    string(1) "1" 
    } 
    ["weather"]=> 
    object(SimpleXMLElement)#206 (2) { 
    ["@attributes"]=> 
    array(1) { 
    ["section"]=> 
    string(1) "0" 
    } 
    ["problem_cause"]=> 
    object(SimpleXMLElement)#94 (1) { 
    ["@attributes"]=> 
    array(1) { 
    ["data"]=> 
    string(0) "" 
    } 
    } 
    } 
} 

Tôi cần phải kiểm tra xem nút "problem_cause" tồn tại. Ngay cả khi nó trống, kết quả là một lỗi. Trên tay php, tôi thấy mã này php mà tôi sửa đổi cho nhu cầu của tôi:

function xml_child_exists($xml, $childpath) 
{ 
    $result = $xml->xpath($childpath); 
    if (count($result)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

if(xml_child_exists($xml, 'THE_PATH')) //error 
{ 
    return false; 
} 
return $xml; 

Tôi không có ý tưởng gì để đưa vào vị trí của truy vấn xpath 'THE_PATH' để kiểm tra xem nút tồn tại. Hoặc tốt hơn là chuyển đổi đối tượng simplexml thành dom?

Trả lời

27

Nghe có vẻ đơn giản isset() giải quyết vấn đề này.

<?php 
$s = new SimpleXMLElement('<foo version="1"> 
    <weather section="0" /> 
    <problem_cause data="" /> 
</foo>'); 
// var_dump($s) produces the same output as in the question, except for the object id numbers. 
echo isset($s->problem_cause) ? '+' : '-'; 

$s = new SimpleXMLElement('<foo version="1"> 
    <weather section="0" /> 
</foo>'); 
echo isset($s->problem_cause) ? '+' : '-'; 

in +- mà không có bất kỳ thông báo lỗi/cảnh báo nào.

+0

Oh, cảm ơn. Đó là một giải pháp rất dễ dàng. – reggie

+0

Nên sử dụng 'empty()' hơn 'isset()'. Việc truy cập con của đối tượng sẽ tạo nó nếu nó không tồn tại, vì vậy SimpleXMLElement sẽ trả về một phần tử rỗng và 'isset()' sẽ trả về true. –

+0

@ MugomaJ.Okomba 'empty()' trả về true ngay cả khi nút tồn tại nhưng không có nội dung – CITBL

2

Sử dụng mã bạn đã đăng, Ví dụ này sẽ hoạt động để tìm nút problem_cause ở bất kỳ độ sâu nào.

function xml_child_exists($xml, $childpath) 
{ 
    $result = $xml->xpath($childpath); 
    return (bool) (count($result)); 
} 

if(xml_child_exists($xml, '//problem_cause')) 
{ 
    echo 'found'; 
} 
else 
{ 
    echo 'not found'; 
} 
1

thử điều này:

function xml_child_exists($xml, $childpath) 
{ 
    $result = $xml->xpath($childpath); 
    if(!empty($result)) 
{ 
    echo 'the node is available'; 
} 
else 
{ 
    echo 'the node is not available'; 
} 
} 

tôi hy vọng điều này sẽ giúp bạn ..