如何使用PHP读取TMX文件中tuv标签的xml:lang属性
读取TMX文件中tuv标签的xml:lang属性问题
问题描述
处理TMX翻译文件时,使用PHP的SimpleXML可以正常读取<tu>标签的属性(如creationdate),但尝试读取<tuv>标签的xml:lang属性时,多种方法均返回null或报错。
TMX翻译单元示例
<tu creationdate="20080812T111221Z" creationid="Cheeseus" changedate="20190825T065920Z" changeid="Cheeseus" usagecount="0" tuid="2"> <tuv xml:lang="BG"> <seg>ПАРТНЬОРИ</seg> </tuv> <tuv xml:lang="EN-GB"> <seg>PARTNERS</seg> </tuv> </tu>
当前读取代码
$xmlStr = file_get_contents($uploadedFile); $xmlObj = simplexml_load_string($xmlStr); $TUs = $xmlObj->body->tu; foreach($TUs as $TU) { if(isset($TU->tuv[0]->seg)) { $sourceText = $TU->tuv[0]->seg->asXML(); $targetText = $TU->tuv[1]->seg->asXML(); } }
尝试过的无效方法
var_dump($TU->tuv[0]['xml:lang']); // 结果:null var_dump($TU->tuv['xml:lang']); // 结果:null var_dump($TU->tuv[0]['attributes']['xml:lang']); // 结果:Warning: Trying to access array offset on value of type null... var_dump($TU->tuv[0]['@attributes']['xml:lang']); // 结果:Warning: Trying to access array offset on value of type null...
解决方案
xml:lang属于XML内置命名空间的属性(命名空间URI为http://www.w3.org/XML/1998/namespace),不能像普通属性直接通过数组下标访问,必须通过attributes()方法指定命名空间来获取。
修改后的代码示例:
$xmlStr = file_get_contents($uploadedFile); $xmlObj = simplexml_load_string($xmlStr); $TUs = $xmlObj->body->tu; // 定义XML命名空间URI $xmlNamespace = 'http://www.w3.org/XML/1998/namespace'; foreach($TUs as $TU) { if(isset($TU->tuv[0]->seg)) { // 获取tuv标签的xml:lang属性 $sourceLang = (string)$TU->tuv[0]->attributes($xmlNamespace)->lang; $targetLang = (string)$TU->tuv[1]->attributes($xmlNamespace)->lang; $sourceText = $TU->tuv[0]->seg->asXML(); $targetText = $TU->tuv[1]->seg->asXML(); // 验证输出 var_dump($sourceLang, $targetLang); } }
说明
- 调用
attributes($xmlNamespace)会返回指定命名空间下的所有属性对象,直接访问->lang即可获取xml:lang的值 - 加上
(string)强制类型转换,确保得到的是字符串而非SimpleXMLElement对象
内容的提问来源于stack exchange,提问作者cheeseus
相关产品推荐
相关产品推荐

