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

如何使用PHP重写XML文件解决字符被转义为HTML实体的问题

转义问题出现的原因
  • SimpleXMLElement的saveXML()方法默认会将非ASCII字符(比如你内容里的希腊语)、XML预留特殊字符自动转换为XML实体,这是默认兼容行为,目的是适配不支持UTF-8的低版本XML解析器。
  • 你的代码存在二次解析问题:你先把单个order节点用saveXML()转为字符串,又把这个字符串传入new SimpleXMLElement()做二次解析,过程中会把已经存在的实体再次转义,比如原来的&会被转成&,加重转义问题。
  • 代码计数逻辑错误:你自行遍历统计order数量,for循环用了<= $counter,会多执行一次,读取不存在的order节点时,SimpleXML的容错机制会生成异常内容,也可能导致额外的转义错误。
修复方法(可直接通过PHP重写文件解决)

你可以改用DOMDocument来处理XML,明确指定编码为UTF-8,关闭不必要的实体转义,同时修正原有逻辑问题,修复后的代码如下:

<?php
error_reporting(0);

$xmlFilepath = 'Final.xml';
$targetDir = "/home/floros24/public_html/farmaxml/orders/";
$recordFile = 'info.txt';

function formatXML($xmlFilepath, $targetDir, $recordFile) {
    // 读取已处理的订单ID
    $processedIds = file_exists($recordFile) ? explode(' ', trim(file_get_contents($recordFile))) : [];
    $processedIds = array_filter($processedIds);
    
    $loadxml = simplexml_load_file($xmlFilepath);
    if (!$loadxml) return;

    foreach ($loadxml->order as $order) {
        $key = (string)$order->orderId;
        // 已经处理过的跳过
        if (in_array($key, $processedIds)) {
            echo "{$key} found! <br>";
            continue;
        }

        // 用DOMDocument处理,指定UTF-8编码,避免非必要实体转义
        $dom = new DOMDocument('1.0', 'UTF-8');
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        // 导入order节点到新DOM
        $domNode = $dom->importNode(dom_import_simplexml($order), true);
        $dom->appendChild($domNode);
        
        // 保存文件
        $dom->save($targetDir . $key . '.xml');
        
        // 记录已处理ID
        file_put_contents($recordFile, " {$key}", FILE_APPEND);
    }
}

formatXML($xmlFilepath, $targetDir, $recordFile);
?>

代码优化说明

  • 直接遍历所有order节点,不需要手动统计数量,避免数组越界问题
  • 改用DOMDocument处理,明确指定UTF-8编码,只会对XML必要的特殊字符(< > & " ')做转义,其余非ASCII字符会直接以原始UTF-8字符保存,不会转成实体
  • 优化了已处理订单的判断逻辑,不需要逐行遍历匹配,减少重复操作
  • 新增文件存在判断,避免首次运行时info.txt不存在的报错

如果你需要处理已经生成的带转义实体的XML文件,可以用以下代码批量解码:

// 单个文件处理示例
$filePath = '9132.xml';
$content = file_get_contents($filePath);
// 解码所有HTML/XML实体为原始字符
$decoded = html_entity_decode($content, ENT_XML1, 'UTF-8');
file_put_contents($filePath, $decoded);

内容的提问来源于stack exchange,提问作者Periklis Kakarakidis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:54:03