PHP生成XML时如何链式调用appendChild或批量添加子节点?
PHP DOMDocument 批量添加节点优化方案
方案1:PHP 8.0+ 直接使用原生append()方法
PHP 8.0 及以上版本的 DOM 扩展已原生支持DOMNode::append()方法,可一次性传入任意数量的节点或字符串参数,无需多次调用appendChild():
$dom = new DOMDocument(); $root = $dom->createElement('Root'); // 直接传入多个节点批量插入 $root->append($product, $quantity, $measureUnit, $lineNumber); // 也可以传入节点数组,搭配展开运算符使用 $nodeList = [$product, $quantity, $measureUnit, $lineNumber]; $root->append(...$nodeList); $dom->appendChild($root); $dom->save( '/some/dir/some-name.xml');
方案2:低版本PHP兼容封装辅助函数
如果使用的是PHP 8.0以下版本,可以自行封装批量插入的辅助函数,同时支持链式调用:
/** * 批量给父节点添加子节点 * @param DOMNode $parentNode 父节点 * @param array $children 待插入的子节点数组 * @return DOMNode 返回父节点,支持链式操作 */ function appendChildren(DOMNode $parentNode, array $children): DOMNode { foreach ($children as $child) { $parentNode->appendChild($child); } return $parentNode; }
使用示例:
// 批量添加节点 appendChildren($root, [ $product, $quantity, $measureUnit, $lineNumber ]); // 支持链式调用继续操作 appendChildren($root, [$node1, $node2])->appendChild($anotherNode);
方案3:面向对象方式扩展DOM类
如果不想使用全局函数,也可以继承原生DOM类自定义方法,使用更灵活:
// 自定义DOMElement类,添加批量插入方法 class MyDOMElement extends DOMElement { public function appendChildren(array $children): self { foreach ($children as $child) { $this->appendChild($child); } return $this; } } // 自定义DOMDocument类,注册自定义节点类 class MyDOMDocument extends DOMDocument { public function __construct($version = '1.0', $encoding = '') { parent::__construct($version, $encoding); $this->registerNodeClass('DOMElement', MyDOMElement::class); } }
使用示例:
$dom = new MyDOMDocument(); $root = $dom->createElement('Root'); // 直接调用自定义方法,支持链式操作 $root->appendChildren([$product, $quantity, $measureUnit]) ->appendChildren([$lineNumber, $otherNode]); $dom->appendChild($root); $dom->save( '/some/dir/some-name.xml');
内容的提问来源于stack exchange,提问作者jpneey
相关产品推荐
相关产品推荐

