You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP DOM生成XML嵌套结构:元素覆盖与CDATA节点问题

用PHP DOM扩展生成XML的问题与修复方案

问题回顾

  1. 元素嵌套错误:创建<imgs>和<main>后,它们没有作为<o>的子元素,反而直接成为<offers>的子元素,原因是未将这些节点正确追加到<o>节点下。
  2. 多节点生成失败:<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:55:20