PHP DOM生成XML嵌套结构:元素覆盖与CDATA节点问题
用PHP DOM扩展生成XML的问题与修复方案
问题回顾
- 元素嵌套错误:创建
<imgs>和<main>后,它们没有作为<o>的子元素,反而直接成为<offers>的子元素,原因是未将这些节点正确追加到<o>节点下。 - 多节点生成失败:
<attrs>下的<a>元素重复复用同一个节点,导致所有属性都堆在单个<a>上,且未正确添加CDATA内容。
正确实现代码
<?php // 初始化DOM文档 $dom = new DOMDocument('1.0', 'UTF-8'); $dom->formatOutput = true; // 创建根节点<offers> $offers = $dom->createElement('offers'); $dom->appendChild($offers); // 创建<o>元素并设置属性 $o = $dom->createElement('o'); $o->setAttribute('id', '123'); $offers->appendChild($o); // 添加<name>子元素 $name = $dom->createElement('name', '产品名称'); $o->appendChild($name); // 处理<imgs>嵌套<main> $imgs = $dom->createElement('imgs'); $o->appendChild($imgs); // 关键:将<imgs>追加到<o>下 $main = $dom->createElement('main'); $main->setAttribute('url', 'https://example.com/main.jpg'); $imgs->appendChild($main); // 将<main>追加到<imgs>下 // 处理<attrs>下的多个<a>元素(带CDATA) $attrs = $dom->createElement('attrs'); $o->appendChild($attrs); // 将<attrs>追加到<o>下 // 模拟属性数据 $attributes = [ ['name' => '颜色', 'value' => '红色'], ['name' => '尺寸', 'value' => 'XL'], ['name' => '材质', 'value' => '纯棉'] ]; foreach ($attributes as $attr) { // 每次循环新建<a>节点,避免复用 $a = $dom->createElement('a'); $a->setAttribute('name', $attr['name']); // 创建CDATA节点并追加到<a> $cdata = $dom->createCDATASection($attr['value']); $a->appendChild($cdata); $attrs->appendChild($a); } // 输出XML echo $dom->saveXML(); ?>
关键修复点
- 节点追加路径:所有属于
<o>的子元素(<name>、<imgs>、<attrs>)必须通过$o->appendChild()追加,而不是直接追加到根节点<offers>。嵌套元素如<main>要追加到<imgs>下,保证层级正确。 - 多节点生成:循环生成
<a>时,必须在循环内部调用createElement()创建新节点,不能复用同一个DOMElement对象;CDATA内容通过createCDATASection()创建后,追加到对应的<a>节点中。
内容的提问来源于stack exchange,提问作者Marcin Wierzycki
相关产品推荐
相关产品推荐

