0

我正在使用 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 中了,我现在想保持这个方向。

4

2 回答 2

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"
}
于 2013-04-19T23:47:41.337 回答
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
)
于 2013-04-20T07:39:41.563 回答