PHP DOMElement是不可变的。 ='没有修改允许错误'

时间:2011-06-15 02:14:14

标签: php xml dom

我无法理解为什么会失败。 DOMElement是否需要成为文档的一部分?

$domEl = new DOMElement("Item"); 
$domEl->setAttribute('Something','bla'); 

抛出异常

> Uncaught exception 'DOMException' with message 'No Modification Allowed Error';

我原本以为我可以创建一个DOMElement,它会变得可变。

2 个答案:

答案 0 :(得分:33)

来自http://php.net/manual/en/domelement.construct.php

  

创建一个新的DOMElement对象。 此对象为只读。它可以附加到文档,但是在节点与文档相关联之前,可以不将附加节点附加到该节点。要创建可写节点,请使用DOMDocument::createElementDOMDocument::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'));
    }
}