PHP的SimpleXML扩展提供了轻量级的XML处理方案,其中addChild方法是实现动态添加XML子节点和属性的核心函数,不需要复杂的DOM操作就能完成XML结构的动态构建。

addChild方法基本语法
addChild方法的官方定义如下,它属于SimpleXMLElement类的实例方法:
/**
* 添加子节点到当前XML节点
* @param string $name 子节点名称
* @param string|null $value 子节点的值,可选
* @param string|null $namespace 命名空间,可选
* @return SimpleXMLElement|false 返回新创建的子节点对象,失败返回false
*/
public function addChild(string $name, ?string $value = null, ?string $namespace = null): SimpleXMLElement|false {}
添加普通子节点
当只需要添加没有值的子节点时,只需要传入子节点名称即可,示例代码如下:
// 创建根节点
$xml = new SimpleXMLElement('<root></root>');
// 添加子节点item,无值
$itemNode = $xml->addChild('item');
// 输出XML结构
echo $xml->asXML();
上述代码执行后输出的XML内容为:
<?xml version="1.0"?> <root><item/></root>
添加带值的子节点
如果需要给子节点设置文本内容,可以传入第二个参数作为节点值,示例代码如下:
$xml = new SimpleXMLElement('<root></root>');
// 添加带值的子节点book,值为PHP入门教程
$xml->addChild('book', 'PHP入门教程');
// 再添加一个带值的子节点price,值为49.9
$xml->addChild('price', '49.9');
echo $xml->asXML();
执行后输出的XML内容如下:
<?xml version="1.0"?> <root><book>PHP入门教程</book><price>49.9</price></root>
为节点添加属性
addChild方法本身不能直接添加属性,需要获取到子节点对象后,使用addAttribute方法为节点添加属性,示例代码如下:
$xml = new SimpleXMLElement('<root></root>');
// 添加子节点user
$userNode = $xml->addChild('user');
// 为user节点添加id属性,值为1001
$userNode->addAttribute('id', '1001');
// 为user节点添加role属性,值为admin
$userNode->addAttribute('role', 'admin');
// 给user节点添加子节点name,值为张三
$userNode->addChild('name', '张三');
echo $xml->asXML();
执行后输出的XML内容如下:
<?xml version="1.0"?> <root><user id="1001" role="admin"><name>张三</name></user></root>
嵌套添加子节点
addChild返回的也是SimpleXMLElement对象,因此可以链式调用或者嵌套添加多层子节点,示例代码如下:
$xml = new SimpleXMLElement('<root></root>');
// 添加第一层子节点order
$orderNode = $xml->addChild('order');
// 为order添加属性
$orderNode->addAttribute('order_id', '20240501001');
// 为order添加子节点goods
$goodsNode = $orderNode->addChild('goods');
// 为goods添加子节点
$goodsNode->addChild('goods_name', '无线鼠标');
$goodsNode->addChild('quantity', '2');
$goodsNode->addChild('unit_price', '89.9');
echo $xml->asXML();
执行后输出的XML结构如下:
<?xml version="1.0"?>
<root>
<order order_id="20240501001">
<goods>
<goods_name>无线鼠标</goods_name>
<quantity>2</quantity>
<unit_price>89.9</unit_price>
</goods>
</order>
</root>
注意事项
- addChild方法添加的子节点会自动处理特殊字符转义,比如节点值中包含<、&等字符时,会自动转义为对应实体,不需要手动处理。
- 如果添加的子节点名称包含命名空间,需要传入第三个参数指定命名空间URI。
- addChild方法返回的是新创建的子节点对象,如果添加失败会返回false,实际开发中可以根据返回值判断操作是否成功。
- 如果要修改已有节点的值,可以直接对节点对象赋值,不需要使用addChild方法。