如果找不到属性,XPath将返回null?

时间:2013-04-19 23:42:38

标签: php xpath

我正在使用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中了,我现在想继续朝着这个方向努力。

2 个答案:

答案 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
)