在PHP开发中,把数组数据转换成XML格式是一种常见的需求,比如对外提供数据接口、与旧系统对接等场景。XML具有良好的结构性和跨平台能力,而PHP数组使用起来非常灵活,因此我们需要一套可靠的方法来完成两者之间的转换。

使用SimpleXML实现基本转换
SimpleXML扩展提供了简洁的面向对象接口,适合处理结构不太复杂的关联数组。我们可以递归地添加子节点来构建XML。
<?php
function array_to_xml($data, $xml = null) {
if ($xml === null) {
$xml = new SimpleXMLElement('<root/>');
}
foreach ($data as $key => $value) {
if (is_array($value)) {
$sub = $xml->addChild($key);
array_to_xml($value, $sub);
} else {
$xml->addChild($key, htmlspecialchars($value));
}
}
return $xml->asXML();
}
$arr = array(
'name' => '张三',
'age' => 28,
'hobby' => array('reading', 'coding')
);
echo array_to_xml($arr);
?>
使用DOMDocument处理更复杂的结构
当数组中包含数字索引或需要设置节点属性时,DOMDocument会更加合适,它能精确控制文档结构和编码。
<?php
function build_xml($array, $dom, $parent) {
foreach ($array as $k => $v) {
if (is_numeric($k)) {
$k = 'item';
}
if (is_array($v)) {
$node = $dom->createElement($k);
$parent->appendChild($node);
build_xml($v, $dom, $node);
} else {
$node = $dom->createElement($k, htmlspecialchars($v));
$parent->appendChild($node);
}
}
}
$data = array(
'user' => array(
'id' => 1,
'tags' => array('php', 'xml')
)
);
$dom = new DOMDocument('1.0', 'UTF-8');
$root = $dom->createElement('response');
$dom->appendChild($root);
build_xml($data, $dom, $root);
$dom->formatOutput = true;
echo $dom->saveXML();
?>
注意事项
- 节点名称不能是纯数字,必要时可映射为item之类的标签名
- 文本值中的<、>、&等字符应使用htmlspecialchars处理
- 如果数组键名包含空格,建议先替换为下划线再生成节点
小结
PHP把数组转换成XML格式并不复杂,核心在于递归遍历和选择合适的XML扩展。SimpleXML写起来快,DOMDocument控制力强,根据实际数据结构选用即可。