gpt4 book ai didi

php - 无法理解如何使用 PHP DOMDocument::getElementById

转载 作者:行者123 更新时间:2023-11-28 03:17:44 25 4
gpt4 key购买 nike

我用 PHP 编写了这个小测试代码,以尝试掌握 DOMDocument::getElementById 的工作原理。我这样写是为了可以使用方法链。

<?php
class SMHtmlElement extends DOMElement {

public function __construct($name, $value = NULL, $namespaceURI = NULL) {
parent::__construct($name, $value, $namespaceURI);
}

public function attr($attribute, $value) {
if (!empty($attribute)) {
$this->setAttribute($attribute, $value);
}
return $this;
}

public function id($value) {
$this->attr('id', $value);

// this doesn't helped.
@$this->ownerDocument->validate();

$this->setIdAttribute('id',TRUE);
return $this;
}
}

class SMHtmlDocument extends DOMDocument {

private $body;

public function __construct() {
parent::__construct("1.0", "UTF-8");
$this->validateOnParse = true;
$this->loadHTML('<!DOCTYPE html><html><head></head><body></body></html>');
$this->body = $this->getElementsByTagName('body')->item(0);
}

public final function bodyAdd($element, $beforeElement = NULL) {
$el = new SMHtmlElement($element);
if ($beforeElement)
$beforeElement->insertBefore($el);
else
$this->body->appendChild($el);

return $el;
}
}

// this search should work it didn't
$dom = new SMHtmlDocument();
$p1 = $dom->bodyAdd('p')->id('foo');
$p = $dom->getElementById('foo');
echo $dom->saveHTML();
var_dump($p);

// when set the ID outside the method, it works.
$p2 = $dom->getElementsByTagName('p')->item(0);
$p2->setIdAttribute('id',true);
$p = $dom->getElementById('foo');
var_dump($p);

// let's see if both paragraph elements are the same
var_dump($p1->isSameNode($p2));
?>

执行后,我得到了这个输出:

$> php teste.php
<!DOCTYPE html>
<html><head></head><body><p id="foo"></p></body></html>
NULL // first var_dump()
object(DOMElement)#4 (0) { // second var_dump()
}
bool(true)

如您所见,我在方法 id() 中将属性 id 标记为 ID,但它不起作用。但是当我在对象外部调用方法 setIdAttribute() 时,它确实起作用了。

这里的一些帖子建议使用 DTD,但是当我尝试生成 HTML5 时,据我所知,HTML5 并非基于 DTD。我也知道我可以使用 XPath 找到我想要的 ID,但我真的想了解为什么我的代码没有按预期工作。

我在安装了 PHP 5.3 的 Ubuntu 12.04 服务器上运行它。

谁能给我解释一下发生了什么?

谢谢!

最佳答案

我认为 setIdAttribute 方法的行为非常奇怪。由于某些奇怪的原因,此方法必须被调用偶数次。我不确定它在不同版本的 PHP 中是否一致。就我而言 (5.5.13) 这有效:

版本 1:工作

$dom = new SMHtmlDocument();
$p1 = $dom->bodyAdd('p')->attr('id','foo');
$p = $dom->getElementById('foo');
echo $dom->saveHTML();
var_dump($p);

$p2 = $dom->getElementsByTagName('p')->item(0);
$p = $dom->getElementById('foo');
var_dump($p);

// let's see if both paragraph elements are the same
var_dump($p1->isSameNode($p2));

这也适用:

版本 2:工作

$dom = new SMHtmlDocument();
$p1 = $dom->bodyAdd('p')->attr('id','foo');
$p1->setIdAttribute('id', TRUE);
$p1->setIdAttribute('id', TRUE);
$p = $dom->getElementById('foo');
echo $dom->saveHTML();
var_dump($p);

$p2 = $dom->getElementsByTagName('p')->item(0);
$p = $dom->getElementById('foo');
var_dump($p);

// let's see if both paragraph elements are the same
var_dump($p1->isSameNode($p2));

这不是:

版本 3:损坏

$dom = new SMHtmlDocument();
$p1 = $dom->bodyAdd('p')->attr('id','foo');
$p1->setIdAttribute('id', TRUE);
$p = $dom->getElementById('foo');
echo $dom->saveHTML();
var_dump($p);

$p2 = $dom->getElementsByTagName('p')->item(0);
$p2->setIdAttribute('id', TRUE);
$p2->setIdAttribute('id', TRUE);
$p = $dom->getElementById('foo');
var_dump($p);

// let's see if both paragraph elements are the same
var_dump($p1->isSameNode($p2));

我认为这是底层 xml 库的错误,可能是 libxml2。

关于php - 无法理解如何使用 PHP DOMDocument::getElementById,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26681716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com