如何使用PHP从TXM(XML)标签中读取特定属性

jaql4c8m  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(119)

下面是来自TMX文件的TU(翻译单元)示例:

<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();
    }
}

我现在尝试读取每个tuvxml:lang属性。我想我可以用访问父tu属性的方式来完成这一点,例如。$TU['creationdate']。但是同样的方法不起作用。
我试过:

var_dump($TU->tuv[0]['xml:lang']) /* result: null */
var_dump($TU->tuv['xml:lang']); /* result: null */
var_dump($TU->tuv[0]['attributes']['xml:lang']); /* result: Warning: Trying to access array offset on value of type null... */
var_dump($TU->tuv[0]['@attributes']['xml:lang']); /* result: Warning: Trying to access array offset on value of type null... */

还有一些完全打破剧本的我还尝试在不使用“xml:“部分的情况下访问此属性-效果相同。
我希望你能给我指出正确的方向。

wqnecbli

wqnecbli1#

要读取属于名称空间的属性,通常需要使用attributes()方法并指定名称空间URI。由于xml:是XML中预定义的名称空间,因此其URI为http://www.w3.org/XML/1998/namespace

$TU->tuv[0]->attributes('http://www.w3.org/XML/1998/namespace')->lang;

但是你可以将('xml', true)作为参数传递:

$TU->tuv[0]->attributes('xml', true)->lang;

所以工作代码应该是这样的(顺便说一句:我不知道你在阅读节点值时称->asXml()为什么,所以我删除了它):

$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;
        $targetText = $TU->tuv[1]->seg;

        $sourceLang = (string)$TU->tuv[0]->attributes('xml', true)->lang;
        $targetLang = (string)$TU->tuv[1]->attributes('xml', true)->lang;

        echo "Source Text: {$sourceText}, Source Language: {$sourceLang}\n";
        echo "Target Text: {$targetText}, Target Language: {$targetLang}\n";
    }
}

将产生:

Source Text: ПАРТНЬОРИ, Source Language: BG
Target Text: PARTNERS, Target Language: EN-GB

相关问题