PHP文档模型:在组合HTML文档中查找元素

时间:2018-01-08 19:03:07

标签: php dom

我有一个使用DOM类组成HTML元素的库。我还想使用DOM功能深入到我的组合元素并检查特定的子元素的值。

例如,这是由名为$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

PHPUnit测试看起来应该是这样的:

null

问题是getElementById()总是回来$document = new \DOMDocument();

在我的研究中,我发现$implementation = new \DOMImplementation(); $document->appendChild($implementation->createDocumentType('HTML')); 仅在文档具有DOCTYPE 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>插入不正确,如下例所示:

$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 = 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". 放入HTML中进行解释(例如this one)。但我不是从HTML开始;我正在编写一个元素并让DOM库编写HTML。

我还尝试按this answer

动态创建实施
yes_no_1

我也尝试使用XPath来获取值:

{{1}}

到目前为止,我没有尝试过任何工作。如何构建测试以便找到{{1}}?

1 个答案:

答案 0 :(得分:1)

在您的XPath版本中 - 您需要围绕检查

的值的引号
$input = $xpath->query("//*[@id='yes_no_1']")->item(0);