PHP DOMElement is Immutable.=“不允许修改错误”

2022-08-30 19:49:36

我不明白为什么这会失败。DOMElement 是否需要成为文档的一部分?

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

引发异常

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

我本来以为我可以创建一个DOMElement,它将是可变的。


答案 1

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

创建新的 DOMElement 对象。此对象是只读的。它可以追加到文档中,但在节点与文档关联之前,其他节点可能不会追加到此节点。要创建可写节点,请使用 或 。DOMDocument::createElementDOMDocument::createElementNS


答案 2

我需要将 \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'));
    }
}

推荐