如何用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);
关键说明
- XML解析可靠性:使用
DOMDocument和DOMXPath而非正则表达式处理XML,避免因标签嵌套、特殊字符导致的解析错误。 - 精准定位CDATA:通过
DOMCdataSection类型判断,确保只处理CDATA节点内的文本。 - prompt优化:明确要求OpenAI仅返回翻译内容,避免多余解释干扰替换逻辑。
- 保留XML结构:替换CDATA内容后直接保存原DOM结构,保证XML格式完全正确。
内容的提问来源于stack exchange,提问作者tee
相关产品推荐
相关产品推荐

