Кажется, я не могу это понять. У меня есть следующий файл XML:
<?xml version="1.0" encoding="UTF-8"?> <targets> <showcases> <building name="Big Blue" /> <building name="Shiny Red" /> <building name="Mellow Yellow" /> </showcases> </targets>
Мне нужно проверить, существует ли узел
с заданным именем. Все, что мне кажется в Google, говорит мне сделать что-то вроде следующего: <building>
$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 = '"]' нарушит выражение) ,