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

Python ElementTree修改XLIFF文件mrk元素文本写入不生效问题求助

问题原因及修正方案

你遇到的问题来自代码里的几处逻辑错误,逐一说明:

  • 树对象不匹配:你调用ET.parse(filetobeol).getroot()直接取了根节点,没有将parse返回的ElementTree实例存储到tree变量,最后调用tree.write()写入的是未经过修改的旧树对象,所以你对根节点下元素的修改都没有落到最终输出的文件里。
  • 多余的target文本赋值:你给<target>元素直接设置了text属性,这会生成不符合xliff规范的结构,文本会出现在<target>标签和子<mrk>标签之间,你只需要给<mrk>元素设置text即可。
  • 重复查找mrk元素:你已经在外层循环遍历到了当前匹配的mrk元素,不需要在if分支内再次调用target.find查找,否则如果一个target下有多个mrk,你每次都会修改第一个mrk,导致匹配逻辑失效。
  • 命名空间注册位置错误:ET.register_namespace只需要全局注册一次,放在循环内部重复执行没有任何意义。

修正后的代码

# 先存储ElementTree实例,再取根节点
tree = ET.parse(filetobeol)
beolroot = tree.getroot()

# 全局注册命名空间,不需要放在循环里
ET.register_namespace("sdl", "http://sdl.com/FileTypes/SdlXliff/1.0")
ET.register_namespace("", "urn:oasis:names:tc:xliff:document:1.2")

xliff_ns = "{urn:oasis:names:tc:xliff:document:1.2}"
for tu in beolroot.findall(f".//{xliff_ns}trans-unit"):
    srctxt = tu.find(f"./{xliff_ns}source")
    print(srctxt.text)
    for target in tu.findall(f"./{xliff_ns}target"):
        for mrk in target.findall(f"./{xliff_ns}mrk"):
            print("mrk is element id " + str(mrk))
            print("mrk text is: " +str(mrk.text))
            mid = mrk.get("mid")
            print("segment id is: " +str(mid))
            if mid in srctrgmap:
                targetvalue = srctrgmap[mid]
                # 直接给当前遍历到的mrk设置text,不需要重新查找,也不要给target设置text
                mrk.text = str(targetvalue)
                print("mrk is STILL element id: " + str(mrk))
                print("new mrk text is: " +str(mrk.text))
            else:
                print("Segment Number " + str(mid) + " has no translation target text")

# 现在write的是修改后的树对象
tree.write("output.sdlxliff", encoding="utf-8", xml_declaration=True)

修正后输出的xliff结构会符合预期:

<target>
    <mrk mtype="seg" mid="1751">你设置的目标文本</mrk>
</target>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:54:03