我无法理解为什么会失败。 DOMElement是否需要成为文档的一部分?
$domEl = new DOMElement("Item");
$domEl->setAttribute('Something','bla');
抛出异常
> Uncaught exception 'DOMException' with message 'No Modification Allowed Error';
我原本以为我可以创建一个DOMElement,它会变得可变。
答案 0 :(得分:33)
来自http://php.net/manual/en/domelement.construct.php
创建一个新的DOMElement对象。 此对象为只读。它可以附加到文档,但是在节点与文档相关联之前,可以不将附加节点附加到该节点。要创建可写节点,请使用
DOMDocument::createElement
或DOMDocument::createElementNS
。
答案 1 :(得分:1)
我需要将 \DOMElement 的一个实例传递给一个函数以添加子元素,所以我最终得到了这样的代码:
class FooBar
{
public function buildXml() : string
{
$doc = new \DOMDocument();
$doc->formatOutput = true;
$parentElement = $doc->createElement('parentElement');
$this->appendFields($parentElement);
$doc->appendChild($parentElement);
return $doc->saveXML();
}
protected function appendFields(\DOMElement $parentElement) : void
{
// This will throw "No Modification Allowed Error"
// $el = new \DOMElement('childElement');
// $el->appendChild(new \DOMCDATASection('someValue'));
// but these will work
$el = $parentElement->appendChild(new \DOMElement('childElement1'));
$el->appendChild(new \DOMCdataSection('someValue1'));
$el2 = $parentElement->appendChild(new \DOMElement('childElement2'));
$el2->setAttribute('foo', 'bar');
$el2->appendChild(new \DOMCdataSection('someValue2'));
}
}