1

这是与问题相关的代码:

$prep = "<select><option>Option 1</option><option selected>Option 1</option></select>"
$td = $dom->createElement('td',$prep);

解决方案:

$f = $this->dom->createDocumentFragment();
$f->appendXML($prep);

但仍然是一个大问题。任何没有值 ex:selected的属性disabled(您不能写为 selected="selected"createElement都不允许您这样做。

如何使用没有价值的属性,而不是像现在这样得到 1000 错误: Warning: DOMDocumentFragment::appendXML() [domdocumentfragment.appendxml]: Entity: line 1: parser error : Specification mandate value for attribute selected Warning: DOMDocumentFragment::appendXML() [domdocumentfragment.appendxml]: Entity: line 2: parser error : chunk is not well balanced

传递selected属性或禁用时会发生这种情况。

4

2 回答 2

1

我无法抗拒纠正。在 PHP 的 DOMDocument 模型实现中,字符串是also对象(这使您可以轻松地选择它们而不是依赖于 nodeValue,这在大多数情况下使生活更轻松)。

要插入带有文本的表格行,请执行以下操作:

$f = new DOMDocument();
$table = $f->createElement("table");
$f->appendChild($table);
$tbody = $f->createElement("tbody");
$table->appendChild($tbody);
$tr = $f->createElement("tr");
$tbody->appendChild($tr);
$td = $f->createElement("td");
$tr->appendChild($td);

// Magic happens here
$td->appendChild(new DOMText("this is my text"));

顺便说一句,空属性在正确插入时会被保留 - 但是您可以自由使用 selected="selected",只要它的内容是其属性名称的小写版本,它仍然有效(在 HTML 5 中当属性是布尔属性吗?)。如果您仍然希望将其标记为 boolean true,请使用:

$elem->setAttribute("selected","");

(我只是运行代码+模式,没有任何错误,无需使用shutop)

于 2013-04-15T10:10:20.960 回答
0

我自己找到了答案。
$this->dom = new DOMDocument; 所有其他代码以及您构建的内容
$tbody = $this->dom->createElement('tbody');
$td = $this->dom->createElement('td');

要将一段 html 代码放入 TD 中,您不能只是粘贴它或通过 ->nodeValue = '' 设置值。它将输出为文本,而不是 HTML。

$prep = "<strong>lalala</strong>";或任何其他 html 字符串 // 创建片段并附加它
@@$f = $this->dom->createDocumentFragment(); @@$f->appendXML($prep);

$td->appendChild($f);
——它工作!但要小心 :: HTML 标记的任何类型的空属性,例如<option selected>or<option disabled>都会导致错误并失败。
不要尝试将属性设置为selected="selected". 由于 HTML/XML 解析器,这也将失败。

createDocumentFragment()只要您没有空值属性,例如 selected、disabled 或其他,SO就可以很好地工作

于 2013-04-14T11:22:17.393 回答