PHP SimpleXML如何添加子节点和属性 addChild

27次阅读

php simplexml 中添加子节点和属性需用 addChild() 和 addAttribute() 方法,作用于 SimpleXMLElement 对象; addChild() 创建子元素并支持链式调用,自动转义文本内容; addAttribute() 为已有元素添加属性,属性值自动转义但属性名不校验合法性。

PHP SimpleXML如何添加子节点和属性 addChild

PHP SimpleXML 中添加子节点和属性,主要用 addChild()addAttribute() 两个方法。它们操作的是 SimpleXMLElement 对象,不能直接对字符串或普通数组调用。

添加子节点(使用 addChild)

addChild() 用于向当前元素追加一个子元素。它返回新创建的子节点对象,支持链式调用。

  • 基本语法:$child = $parent->addChild('tagName', 'textContent');
  • 若只传标签名,会创建空元素:$elem->addChild('price');
  • 传内容时自动转义特殊字符(如 & 变成 &),无需手动处理
  • 支持链式添加深层结构:$xml->addChild('book')->addChild('title')->addChild('em')->addAttribute('class', 'highlight')->addChild('text', 'PHP Guide');

添加属性(使用 addAttribute)

addAttribute() 必须在已有元素上调用,不能对文档根直接使用(除非已获取到根元素对象)。

  • 语法:$element->addAttribute('name', 'value');
  • 可多次调用添加多个属性:$item->addAttribute('id', '123')->addAttribute('type', 'digital');
  • 属性值会被自动转义,但属性名不会校验合法性(非法名可能导致生成无效 XML)
  • 不支持命名空间前缀的直接写法(如 xs:type),需用第三个参数指定命名空间 URI

常见组合操作示例

构建一个带属性和文本内容的完整节点:

立即学习PHP免费学习笔记(深入)”;

$xml = simplexml_load_string(''); $item = $xml->addChild('product'); $item->addAttribute('sku', 'P1001'); $item->addAttribute('in_stock', 'true'); $item->addChild('name', 'Wireless Mouse'); $price = $item->addChild('price'); $price->addAttribute('currency', 'USD'); $price->addChild('value', '29.99');

结果 XML 片段:

   Wireless Mouse   29.99 

注意事项和避坑点

SimpleXML 是只读式对象模型,所有修改都作用于内存中的副本;保存需显式调用 asXML()saveXML() 输出。

  • 不能用 addChild() 向字符串或 NULL 添加子节点,会报致命错误
  • 如果父节点是查询结果(如 $xml->item[0]),确保索引存在,否则返回 false 导致后续调用失败
  • 中文等 UTF-8 内容需确保源 XML 声明含 encoding="UTF-8",否则输出可能乱码
  • 要插入未转义的 html 或 CDATA,SimpleXML 不原生支持,需改用 DOMDocument

text=ZqhQzanResources