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

如何用PHP结合OpenAI仅翻译XML文件中的CDATA内容?

仅翻译XML中<![CDATA[]]>标签内容的PHP+OpenAI实现方案

问题描述

我正在使用PHP结合OpenAI对XML文件进行翻译操作,现有脚本会翻译整个XML文档,但我希望仅翻译XML文件中<![CDATA[]]>标签内的文本内容(例如large、the boy is good这类内容)。

现有PHP脚本

$document = file_get_contents('#####.xml');

$prompt = "translate this document into $language:

" . $document;

$response = $openai->completions()->create([
    'model' => 'text-davinci-003',
    'temperature' => 0.5,
    'max_tokens' => 1024,
    'n' => 1,
    'stop' => '

',
]);

// Extract the translated text from the API response
$translatedText = $response['choices'][0]['text'];

// Convert the translated text back to XML or JSON format
$translatedDocument = $translatedText; // Replace this with your own conversion code

// Save the translated document to a file
$filename = "########.xml";

file_put_contents($filename, $translatedDocument);

XML文件示例

<?xml version="1.0" encoding="UTF-8"?>
<page text_nodes="0" filename="home" url="home" id="336760838" language="default">
  <name>Home</name>
  <tags>
    <tag id="e217a308-5401-4c08-8283-ba24340e6051:button:size" type="STRING">
      <text>
        <![CDATA[large]]>
      </text>
    </tag>
 </tags>
</page>

解决方案

直接翻译整个XML会破坏结构,正确做法是用PHP的DOMDocument解析XML,精准定位并翻译CDATA内容后替换回原文档。以下是修改后的完整代码:

// 加载XML文件
$xmlPath = '#####.xml';
$dom = new DOMDocument();
$dom->load($xmlPath);
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

// 目标语言
$language = 'Chinese'; // 替换为你的目标语言,比如"French"、"Japanese"

// 遍历所有CDATA节点
$xpath = new DOMXPath($dom);
$cdataNodes = $xpath->query('//text()');

foreach ($cdataNodes as $node) {
    if ($node instanceof DOMCdataSection) {
        $originalText = trim($node->nodeValue);
        if (empty($originalText)) continue;

        // 构造翻译prompt
        $prompt = sprintf("Translate the following text into %s, return only the translated content without any extra explanation: %s", $language, $originalText);

        // 调用OpenAI接口
        $response = $openai->completions()->create([
            'model' => 'text-davinci-003',
            'temperature' => 0.5,
            'max_tokens' => 1024,
            'n' => 1,
            'stop' => null,
        ]);

        // 获取翻译结果并清理
        $translatedText = trim($response['choices'][0]['text']);

        // 替换原CDATA内容
        $newCdata = $dom->createCDATASection($translatedText);
        $node->parentNode->replaceChild($newCdata, $node);
    }
}

// 保存翻译后的XML文件
$outputFilename = "########.xml";
$dom->save($outputFilename);

关键说明

  1. XML解析可靠性:使用DOMDocument和DOMXPath而非正则表达式处理XML,避免因标签嵌套、特殊字符导致的解析错误。
  2. 精准定位CDATA:通过DOMCdataSection类型判断,确保只处理CDATA节点内的文本。
  3. prompt优化:明确要求OpenAI仅返回翻译内容,避免多余解释干扰替换逻辑。
  4. 保留XML结构:替换CDATA内容后直接保存原DOM结构,保证XML格式完全正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:19:55