2013-03-06 63 views
1

我想在PHP中使用Xpath,但我有一个关于如何在路径中查找标签(ID)的问题,并检查它是否存在。通过我的代码,我可以在匹配的时候得到它,但如果它们存在与否,我必须进行验证并得到真或假。Xpath PHP内部的foreach

HTML为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> 

代码:

$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; 
    } 
} 
+0

你应该完成所有问题这里http://stackoverflow.com/questions/15215484/xpath-with-foreach/15215729 – 2013-03-07 04:53:48

回答

1

使用$tag->parentNode->hasAttribute('id')的形状$tag(这实际上是一个属性),或做在一个的xpath:

带ID的区域,选择形状属性:

//area[@id]/@shape 

区的无标识,选择形状属性:

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

一些例子(属性的->parentNode是实际<area>元素它在):

$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; 
    } 
} 

或者:

$ids = $xpath->query('//area[@shape]/@id'); 
foreach($ids as $id){ 
     echo $id->nodeValue.PHP_EOL; 
}