我有一个使用DOM类组成HTML元素的库。我还想使用DOM功能深入到我的组合元素中,并检查特定子元素的值。
例如,下面是一个名为
YesNoControl
:
<div id="yes_no">
<input id="yes_no_1" name="yes_no" value="1" type="radio"/>
<label for="yes_no_1">Yes</label>
<input id="yes_no_2" name="yes_no" value="2" type="radio"/>
<label for="yes_no_2">No</label>
</div>
PHPUnit测试应如下所示:
$element = new YesNoControl();
$element_dom = $element->toDOMDocument(); // This method renders the object to a DOMDocument object.
$element_dom->validate();
$this->assertInstanceOf(\\DOMDocument::class, $element_dom);
$input = $element_dom->getElementById('yes_no_1');
$this->assertInstanceOf(\DOMNode::class, $input);
$this->assertEquals('1', $input->getAttribute('yes_no_1'));
问题是
$input
总是回来
null
.
在我的研究中,我发现
getElementById()
仅当文档具有DOCTYPE HTML标记时有效。在我的生成器中,我以简单明了的方式创建文档:
$document = new \DOMDocument();
创建文档后,我尝试直接将实现标记添加到文档中,因此:
$implementation = new \DOMImplementation();
$document->appendChild($implementation->createDocumentType('HTML'));
但是,这会生成具有
<!DOCTYPE HTML>
插入错误,如以下示例:
<div id="yes_no">
<!DOCTYPE HTML>
<input id="yes_no_1" name="yes_no" value="1" type="radio"/>
<label for="yes_no_1">Yes</label>
<input id="yes_no_2" name="yes_no" value="2" type="radio"/>
<label for="yes_no_2">No</label>
</div>
我看到不少答案提到
<!DOCTYPE HTML>
转换为HTML(例如。
this one
). 但我不是从HTML开始的;我正在编写一个元素,并让DOM库编写HTML。
我还尝试根据
this answer
:
$element_dom = $element->toDOMDocument(); // This method renders the object to a DOMDocument object.
$element_dom->validate();
$dtd = '<!ELEMENT input (#PCDATA)>';
$systemId = 'data://text/plain;base64,'.base64_encode($dtd);
$implementation = new \DOMImplementation;
$element_dom->appendChild($$implementation->createDocumentType('HTML', null, $systemId));
$input = $element_dom->getElementById('yes_no_1');
$this->assertInstanceOf(\DOMNode::class, $input);
// Failed asserting that null is an instance of class "DOMNode".
我还尝试使用XPath获取值:
$xpath = new \DOMXPath($element_dom);
$input = $xpath->query("//*[@id=yes_no_1]")->item(0);
$this->assertInstanceOf(\DOMNode::class, $input);
// Failed asserting that null is an instance of class "DOMNode".
到目前为止,我尝试过的都没有起作用。我需要如何组织我的测试,以便它可以找到
yes_no_1
?