I can't seem to figure this one out. I have the following XML file:
<?xml version="1.0" encoding="UTF-8"?>
<targets>
<showcases>
<building name="Big Blue" />
<building name="Shiny Red" />
<building name="Mellow Yellow" />
</showcases>
</targets>
I need to be able to test whether or not a
node exists with a given name. Everything I seem to find on Google tells me to do something like the following:<building>
$xdoc->getElementsByTagName('building')->item(0)->getAttributeNode('name')
... but if I understand that correctly, doesn't that only test the first <building>
node? item(0)
? Do I need to use XQuery for this?
I'd appreciate some help! Thanks!
I'd suggest the following (PHP using ext/simplexml and 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);
}
Okay, looks like XPath was what I wanted. Here's what I came up with that does what I want:
<?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;
}
?>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With