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
相关产品推荐
相关产品推荐

