PHP操作XLIFF文件:如何修改指定ID的trans-unit节点的target文本值及代码问题排查
解决XLIFF文件中指定ID的
<target>文本修改问题 咱们先拆解下你当前代码里的几个问题,这也是为什么print_r输出为空的原因:
- 变量名拼写不一致:你定义的是
$xliffBodies,但循环里用的是$xliffBody,循环根本没执行起来 - 只获取了第一个
<body>节点:你的XLIFF里有两个<body>,目标IDNFDBB2FA9-tu7在第二个body里,直接取item(0)会漏掉它 - 直接打印
DOMNodeList对象:这个对象本身不会输出直观的节点内容,得遍历里面的元素才能看到有效信息
下面是修正后、能实现你需求的完整代码,我会一步步解释关键点:
<?php $dom = new \DOMDocument(); // 加载XML时忽略小的格式错误,避免缩进或换行问题导致加载失败 $dom->loadXML(file_get_contents("my.xlf"), LIBXML_NOERROR); // 获取所有<body>节点,不局限于第一个 $xliffBodies = $dom->getElementsByTagName("body"); // 配置你要修改的目标ID和新的译文内容 $targetTransUnitId = "NFDBB2FA9-tu7"; $newTargetContent = "Kami"; // 印尼语中"We"的标准译文 // 遍历每个<body>节点 foreach ($xliffBodies as $body) { // 获取当前body下的所有<trans-unit>节点 $transUnits = $body->getElementsByTagName("trans-unit"); // 逐个检查trans-unit的ID foreach ($transUnits as $unit) { if ($unit->getAttribute("id") === $targetTransUnitId) { // 找到对应的<target>节点 $targetNode = $unit->getElementsByTagName("target")->item(0); if ($targetNode) { // 更新target的文本内容 $targetNode->nodeValue = $newTargetContent; echo "已成功修改ID为{$targetTransUnitId}的译文内容\n"; } // 找到目标后直接跳出循环,提升遍历效率 break; } } } // 保存修改后的XML文件,开启formatOutput让代码更易读 $dom->formatOutput = true; $dom->save("modified_my.xlf"); // 可选:验证修改结果 $checkDom = new \DOMDocument(); $checkDom->load("modified_my.xlf"); $xpath = new \DOMXPath($checkDom); $targetNode = $xpath->query("//trans-unit[@id='{$targetTransUnitId}']/target")->item(0); if ($targetNode) { echo "验证:修改后的译文为:" . $targetNode->nodeValue . "\n"; } ?>
代码关键点说明
- XML加载优化:用
loadXML配合file_get_contents,加上LIBXML_NOERROR参数,能避免因为XML的缩进、换行等小格式问题导致加载失败 - 全body遍历:不再只取第一个body,确保不会漏掉任何一个trans-unit节点
- 精准匹配与修改:通过
getAttribute("id")精准定位目标trans-unit,找到后直接更新<target>的nodeValue完成文本修改 - 安全保存与验证:修改完成后保存到新文件(避免覆盖原文件),额外添加的验证步骤可以让你直观确认修改是否成功
运行这个脚本后,你会得到一个modified_my.xlf文件,里面ID为NFDBB2FA9-tu7的<target>文本已经被改成你设置的内容啦。如果需要修改其他ID,只需要修改$targetTransUnitId和$newTargetContent的值即可。
内容的提问来源于stack exchange,提问作者mending3
相关产品推荐
相关产品推荐

