1

I'm trying to use Xpath in PHP but I have a question about how to find a tag (ID) in the path and check whether or not it exists. With my code, I get just when it matches, but I have to just verify and get true or false if they exists or not for each one.

HTML for Xpath:

<map name="Map" id="Map"> <area shape="poly" id="normal" coords="181,1283,83,1282,108,177,1124,174,1124,205,1124,213,1126,218,1141,221,1182,224,1204,224,1231,221,1253,218,1265,203,1266,174,2055,171,2055,1092,2002,1077,1935,1057,1920,1052,1904,1051,1901,1043,1893,1036,1874,1034,1861,1030,1829,1025,1802,1022,1785,1021,1765,1020,1741,1018,1723,1022,1720,1026,1714,1029,1713,1035,1715,1041,1713,1049,1616,1047,1509,1047,1436,1048,1417,1049,1386,1049,1318,1048,1304,1047,1300,1048,1288,1052,1278,1049,1247,1047,1177,1049,1135,1048,1069,1047,1047,1046,1000,1047,946,1047,902,1048,842,1048,814,1049,799,1049,778,1049,768,1051,763,1050,742,1048,698,1048,662,1048,573,1101,581,387,575,385,197,386,181,1283" href="#" /> <area id="excludente" shape="rect" coords="952,491,1494,769" href="#" /> <area id="excludente" shape="poly" coords="654,599,663,580,669,577,731,578,736,579,739,588,738,599,738,677,734,682,729,684,667,685,662,679,659,668,653,600,653,598" href="#" /> <area shape="poly" coords="1695,582,1697,579,1700,577,1709,576,1769,576,1771,578,1787,598,1786,605,1770,681,1764,685,1746,684,1705,683,1698,681,1696,675,1695,583" href="#" /> <area shape="poly" coords="-1,84,2056,78,2055,0,0,0,0,83" href="#" /> </map> 

Code:

$DOM = new DOMDocument; $DOM->loadHTML($conteudo['ambiente']->mapeamento); $xpath = new DOMXPath($DOM); $tags = $xpath->query('//area/@shape'); foreach ($tags as $linha => $tag) { $ctags = $xpath->query("../@id", $tag); //Verify ecah one, not just the founded foreach ($ctags as $linha_item2 => $ctag) { echo $ctag->nodeValue; } } 
1

1 Answer 1

1

Use $tag->parentNode->hasAttribute('id') on the shape $tag (which is actually an attribute), or do it in one xpath:

Area's with id, select the shape attribute:

//area[@id]/@shape 

Area's without id, select the shape attribute:

//area[not(@id)]/@shape 

Some examples (the ->parentNode of an attribute is the actual <area> element it's in):

$tags = $xpath->query('//area/@shape'); foreach ($tags as $linha => $tag) { if($tag->parentNode->hasAttribute('id')){ echo $tag->parentNode->getAttribute('id').PHP_EOL; } else { echo 'Oh no, I have no ID!'.PHP_EOL; } } 

Or:

$ids = $xpath->query('//area[@shape]/@id'); foreach($ids as $id){ echo $id->nodeValue.PHP_EOL; } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.