2009-03-31 32 views
7

Tôi dường như không thể tìm ra nút này. Tôi có tập tin XML sau:PHP: Kiểm tra xem nút XML có tồn tại với thuộc tính

<?xml version="1.0" encoding="UTF-8"?> 
<targets> 
    <showcases> 
    <building name="Big Blue" /> 
    <building name="Shiny Red" /> 
    <building name="Mellow Yellow" /> 
    </showcases> 
</targets> 

tôi cần để có thể kiểm tra hay không một nút <building> tồn tại với một tên nhất định. Tất cả mọi thứ tôi dường như tìm thấy trên Google nói với tôi để làm một cái gì đó như sau:

$xdoc->getElementsByTagName('building')->item(0)->getAttributeNode('name') 

... nhưng nếu tôi hiểu rằng một cách chính xác, không chỉ kiểm tra <building> nút đầu tiên? item(0)? Tôi có cần sử dụng XQuery cho việc này không?

Tôi đánh giá cao một số trợ giúp! Cảm ơn!

Trả lời

9

tôi muốn đề nghị như sau (PHP sử dụng ext/SimpleXML và XPath):

$name = 'Shiny Red'; 
$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?> 
<targets> 
    <showcases> 
    <building name="Big Blue" /> 
    <building name="Shiny Red" /> 
    <building name="Mellow Yellow" /> 
    </showcases> 
</targets>'); 
$nodes = $xml->xpath(sprintf('/targets/showcases/building[@name="%s"]', $name); 
if (!empty($nodes)) { 
    printf('At least one building named "%s" found', $name); 
} else { 
    printf('No building named "%s" found', $name); 
} 
+1

giống như hàm xpath ở trên bị thiếu dấu ngoặc đơn đóng") ". Nếu không, cảm ơn mã tuyệt vời –

3

Ok, có vẻ như XPath là thứ tôi muốn. Dưới đây là những gì tôi đã đưa ra mà những gì tôi muốn:

<?php 

$xmlDocument = new DOMDocument(); 

$nameToFind = "Shiny Red"; 

if ($xmlDocument->load('file.xml')) { 
     if (checkIfBuildingExists($xmlDocument, $nameToFind)) { 
     echo "Found a red building!"; 
    } 
} 

function checkIfBuildingExists($xdoc, $name) { 
    $result = false; 
    $xpath = new DOMXPath($xdoc); 
    $nodeList = $xpath->query('/targets/showcases/building', $xdoc); 
    foreach ($nodeList as $node) { 
     if ($node->getAttribute('name') == $name) { 
      $result = true; 
     } 
    } 
    return $result; 
} 

?> 
1

biểu thức XPath này:

              /*/*/building[@name = 'Shiny Red']

chọn các yếu tố được đặt tên building giá trị có thuộc tính name là 'Màu đỏ sáng bóng' và đó là ac hild của một đứa trẻ của yếu tố hàng đầu.

Có lẽ trong PHP có cách đánh giá biểu thức XPath, sau đó chỉ cần đánh giá biểu thức XPath ở trên và sử dụng kết quả.

1

nếu tôi hiểu rằng một cách chính xác, không chỉ kiểm tra nút đầu tiên?

Có. Vì vậy, nếu bạn muốn sử dụng các phương thức DOM như vậy, bạn sẽ phải thực hiện nó trong một vòng lặp. Eg .:

$buildings= $xdoc->getElementsByTagName('building'); 
foreach ($buildings as $building) 
    if ($building->getAttribute('name')==$name) 
     return true; 
return false; 

Với XPath bạn có thể loại bỏ các vòng lặp, như được đăng bởi Dimitre và sgehrig, nhưng bạn phải cẩn thận về những gì ký tự mà bạn cho phép được tiêm vào biểu thức XPath (ví dụ $ name. = '"]' sẽ phá vỡ biểu thức).

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