2009-03-31 2 views
7

Я не могу представить, как это сделать. У меня есть следующий XML-файл:PHP: проверьте, существует ли узел XML с атрибутом

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

Мне нужно, чтобы быть в состоянии проверить, существует ли или нет <building> узла с заданным именем. Все, что я, кажется, найти на Google говорит мне, что делать что-то вроде следующего:

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

... но если я понимаю, что правильно, что не только проверить первый <building> узел? item(0)? Нужно ли использовать XQuery для этого?

Буду признателен за помощь! Благодаря!

ответ

9

Я хотел бы предложить следующее (PHP с использованием внутр/SimpleXML и 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

выглядит как функция xpath, указанная выше, не имеет закрывающей круглой скобки ")". В противном случае, спасибо за отличный код –

3

Хорошо, похоже, что XPath - это то, что я хотел. Вот что я придумал, что делает то, что я хочу:

<?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

Это выражение XPath:

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

выбирает элемент с именем building значение из которых name атрибут «Блестящий красный», и это ac hild ребенка верхнего элемента.

Возможно, в PHP есть способ оценить выражения XPath, а затем просто оценить вышеприведенное выражение XPath и использовать результат.

1

, если я понимаю, что правильно, что не только проверить первый узел?

Да. Поэтому, если вы хотите использовать DOM-методы, подобные этому, вам придется делать это в цикле. например .:

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

С помощью XPath можно устранить петлю, как и отправленный Dimitre и sgehrig, но вы должны быть осторожны, о том, что символы позволяют вводить в выражение XPath (например, $ имя

Смежные вопросы