我正在使用XPath查询来查找属性值。但是,我想通过每个div,如果找不到属性,则不返回任何内容。有没有办法做到这一点?
HTML:
<div id="a" class="a">text</div>
<div>text</div>
<div id="b" class="b">text</div>
的XPath:
$values = $XPath->query('//div/@id | //div/@class');
结果:
array('a', 'a', 'b', 'b');
期望的结果:
array('a', 'a', '', '', 'b', 'b');
到目前为止,我已经在XPath中了,我现在想继续朝着这个方向努力。
答案 0 :(得分:3)
为什么不选择所有<div>
元素并使用DOMElement::getAttribute()
来获取属性值?请注意,如果当前元素没有请求的属性,则此方法将返回空字符串。 (实际上你想要什么)。
试试这个:
$html = <<<EOF
<div id="a" class="a"></div>
<div></div>
<div id="b" class="b"></div>
EOF;
$doc = new DOMDocument();
$doc->loadHtml($html);
$selector = new DOMXpath($doc);
$result = array();
foreach($selector->query('//div') as $div) {
$result []= $div->getAttribute('id');
$result []= $div->getAttribute('class');
}
var_dump($result);
输出:
array(6) {
[0] =>
string(1) "a"
[1] =>
string(1) "a"
[2] =>
string(0) ""
[3] =>
string(0) ""
[4] =>
string(1) "b"
[5] =>
string(1) "b"
}
答案 1 :(得分:2)
我只是添加一个额外的答案来提供我自己的措辞,你可以很容易地看到@ hek2gml建议是明智的。
xpath查询只能返回文档中的内容。因此,您无法在同一查询中插入不存在的节点。
所以你需要像描述你想要做的那样去做:
我想浏览每个div,如果找不到属性,则不返回任何内容。
因此,对于div的每个匹配,获取两个属性值,空属性值包括:
$html = <<<BUFFER
<div id="a" class="a">text</div>
<div>text</div>
<div id="b" class="b">text</div>
BUFFER;
$xml = simplexml_import_dom(@DOMDocument::loadHTML($html));
$divs = $xml->xpath('/*/body/div');
$reduce = function(array $array, SimpleXMLElement $div) {
$array[] = (string) $div['id'];
$array[] = (string) $div['class'];
return $array;
};
$values = array_reduce($divs, $reduce, []);
print_r($values);
输出符合预期:
Array
(
[0] => a
[1] => a
[2] =>
[3] =>
[4] => b
[5] => b
)