PHP: проверьте, существует ли узел XML с атрибутом

Кажется, я не могу это понять. У меня есть следующий файл 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 для этого?

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

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

Хорошо, похоже, что 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; } ?> 

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

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

выбирает элемент с именем building значение атрибута name которого «Shiny Red», и это дочерний элемент дочернего элемента верхнего элемента.

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

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

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

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

С XPath вы можете исключить цикл, как опубликовано Dimitre и sgehrig, но вам нужно быть осторожным в отношении того, какие символы вы позволяете вводить в выражение XPath (например, $ name = '"]' нарушит выражение) ,