PHP实现XML转数组的两种方式及注意事项
将XML数据转换为PHP关联数组是开发中常见需求。本文介绍两种核心方案:通过 simplexml_load_string 配合JSON中转的快速方法,以及基于 DOMDocument 递归遍历的灵活方法,并附安全转换代码示例。
方法一:使用 SimpleXML 中转 JSON
这是最简洁的实现方式。PHP 的 SimpleXML 扩展可将 XML 字符串直接解析为对象,随后借助 json_encode 和 json_decode 将其无缝转换为多维数组。此方法代码量少,适合结构相对简单的 XML 数据。
操作步骤:
- 准备 XML 数据:将待转换的 XML 字符串赋值给变量。
- 解析为对象:调用
simplexml_load_string()生成SimpleXMLElement实例。 - 转为 JSON:使用
json_encode()序列化对象。 - 转为数组:使用
json_decode($json, true)获取关联数组。
$xmlData = '<root><name>John Doe</name><age>30</age></root>';
$xml = simplexml_load_string($xmlData);
$json = json_encode($xml);
$array = json_decode($json, true);
print_r($array);
方法二:使用 DOMDocument 递归转换
当 XML 结构复杂、包含多层嵌套或需要精确控制属性映射时,DOMDocument 提供了更底层的操作能力。该方法通过递归函数遍历 DOMNodeList,手动构建数组结构,能够处理属性和子节点的混合内容。
核心逻辑:
- 初始化:创建
new DOMDocument()并使用loadXML()加载数据。 - 递归处理:定义辅助函数
domToArray(),判断当前节点是否为元素节点或文本节点。 - 属性映射:若节点拥有属性,将其名称和值存入数组对应键位。
- 返回值:返回重构后的数组结构。
$xmlData = '<root><name>John Doe</name><age>30</age></root>';
$xml = new DOMDocument();
$xml->loadXML($xmlData);
$array = domToArray($xml->documentElement);
print_r($array);
function domToArray($node) {
$array = array();
if ($node->hasAttributes()) {
foreach ($node->attributes as $attr) {
$array[$attr->nodeName] = $attr->nodeValue;
}
}
if ($node->hasChildNodes()) {
foreach ($node->childNodes as $childNode) {\n if ($childNode->nodeType == XML_ELEMENT_NODE) {
$array[$childNode->nodeName] = domToArray($childNode);
} else if ($childNode->nodeType == XML_TEXT_NODE) {
$array['value'] = $childNode->nodeValue;
}
}
}
return $array;
}
补充:实用工具函数与安全建议
在实际业务(如微信支付接口对接)中,常需处理带有 <![CDATA[]]> 标签的 XML。直接使用标准转换可能导致数据格式异常,建议采用以下封装好的工具函数,并开启安全限制以防范 XXE 攻击。
完整转换工具集
XML 转数组(推荐):
使用 LIBXML_NOCDATA 标记将 CDATA 内容展平为文本,并结合 libxml_disable_entity_loader(true) 禁用外部实体加载。
// Xml转数组
function XmlToArr($xml)
{
if($xml == '') return '';
libxml_disable_entity_loader(true);
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
数组转 XML:
对于数值类型直接输出文本,对于字符串类型自动包裹 <![CDATA[...]]> 以防止特殊字符冲突。
//数组转xml
function ArrToXml($arr)
{
if(!is_array($arr) || count($arr) == 0) return '';
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return $xml;
}
自定义清理函数
若 XML 头部存在非标准声明(如自定义 ),可在转换前通过 str_replace() 进行替换处理,避免解析失败。
function xmlToArray(string $xml, $oldStr = [], $newStr = [])
{
//过滤特殊xml 格式
if (!empty($oldStr)) {
$xml = str_replace($oldStr, $newStr, $xml);
}
$objectXml = simplexml_load_string($xml);
$xmlJson = json_encode($objectXml);
$xmlArray = json_decode($xmlJson, true);
return $xmlArray;
}
以上就是PHP实现XML数据转数组相关详细内容,更多关于PHP XML转数组技巧的资料请关注本站其它相关文章!本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













