元素树不修改元素文本

Element Tree is not modifying element text

我正在使用 ElementTree 修改一个 xliff 文件,其文本包含在 Excel sheet 中。我想 运行 下整个文件并识别我在 Excel sheet 中匹配的元素(匹配基于包含在“mid”属性值中的段 ID) .找到匹配项后,我想用从 Excel sheet 中提取的文本填充元素。对于这个例子,我使用了虚拟文本“Target Segment{segment id}”

我的代码做我想做的一切。我可以识别每个元素并根据需要提取元素文本和属性。我设置了元素的文本值,打印结果时可以看到前后的差异 - “mrk.text”之前是 None,设置新值后,“mrk.text " 填充了正确的虚拟文本。所以一切看起来都在正常工作。

但是 - 当我生成 xml 文件时,我可以看到元素文本仍然是空的。同时,我对 xml 所做的其他修改 - 例如注册名称空间和包含 xml 声明工作正常)。

我希望文本出现在作为“target”元素子元素的“mrk”元素中。但是那里什么也没有写。

我不确定我做错了什么。

我已通读 xml.etree.ElementTree 关于 python.org 的文档,并在此站点和其他几个站点上搜索了正确的答案。我找到了暗示可能的解决方案的答案,但没有完全做到这一点。

(我知道我的标签引用可以在不显式调用命名空间 URI 的情况下进行,但我是 Element Tree 的新手,想在改进我的代码之前先解决我的问题)

我要修改的示例 XML 在这里:

        <trans-unit id="f60d234c-2d06-47e7-b4aa-e2c7a7caf0e8">
            <source>Please select all that apply.</source>
            <seg-source>
                <mrk mtype="seg"
                     mid="1751">Please select all that apply.</mrk>
            </seg-source>
            <target>
                <mrk mtype="seg"
                     mid="1751"/>
            </target>
        </trans-unit>

相关python代码在这里:

beolroot = ET.parse(filetobeol).getroot()
for tu in beolroot.findall(".//{urn:oasis:names:tc:xliff:document:1.2}trans-unit"):
    ET.register_namespace("sdl", "http://sdl.com/FileTypes/SdlXliff/1.0")
    ET.register_namespace("", "urn:oasis:names:tc:xliff:document:1.2")
    #print (tu)
    srctxt = tu.find("./{urn:oasis:names:tc:xliff:document:1.2}source")
    trg = tu.find("./{urn:oasis:names:tc:xliff:document:1.2}target")
    #print (srctxt)
    print (srctxt.text)
    #print (trg)
    for target in tu.findall("./{urn:oasis:names:tc:xliff:document:1.2}target"):
        for mrk in target.findall("./{urn:oasis:names:tc:xliff:document:1.2}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.keys():
                mrk = target.find("./{urn:oasis:names:tc:xliff:document:1.2}mrk")
                targetvalue = srctrgmap[mid]
                #print(targetvalue)
                mrk.text = str(targetvalue)
                target.text = str(targetvalue)
                print ("mrk is STILL element id: " + str(mrk))
                print ("new mrk text is: " +str(mrk.text))
                print ("new target  text is: " +str(target.text))
            else:
                print("Segment Number " + str(mid) + " has no translation target text")
tree.write("output.sdlxliff", encoding="utf-8", xml_declaration=True)

以下代码有效。正如建议的那样,我研究了一个最小的可重现示例。在这样做的过程中,我制作了一个有效的版本。我不确定哪里出了问题。但是这段代码现在完成了我需要它做的事情。

此处示例 xml:

    <?xml version="1.0" encoding="utf-8"?>
<xliff xmlns:sdl="http://sdl.com/FileTypes/SdlXliff/1.0"
       xmlns="urn:oasis:names:tc:xliff:document:1.2"
       version="1.2"
       sdl:version="1.0">
    <file original="C:\File\Location\example.xml">
        <body>
            <trans-unit id="a">
                <source>Foo</source>
                <seg-source>
                    <mrk mtype="seg"
                         mid="1328">Foo</mrk>
                </seg-source>
                <target>
                    <mrk mtype="seg"
                         mid="1328"/>
                </target>
                <sdl:seg-defs>Bar</sdl:seg-defs>
            </trans-unit>
            <trans-unit id="b">
                <source>My Hovercraft</source>
                <seg-source>
                    <mrk mtype="seg"
                         mid="1329">My Hovercraft</mrk>
                </seg-source>
                <target>
                    <mrk mtype="seg"
                         mid="1329"/>
                </target>
                <sdl:seg-defs>Is full of eels</sdl:seg-defs>
            </trans-unit>
            <trans-unit id="c">
                <source>I will not buy this record</source>
                <seg-source>
                    <mrk mtype="seg"
                         mid="1330">I will not buy this record</mrk>
                </seg-source>
                <target>
                    <mrk mtype="seg"
                         mid="1330"/>
                </target>
                <sdl:seg-defs>It is scratched</sdl:seg-defs>
            </trans-unit>
            <trans-unit id="d">
                <source>I will not buy this tobacconist</source>
                <seg-source>
                    <mrk mtype="seg"
                         mid="1331">I will not buy this tobacconist</mrk>
                </seg-source>
                <target>
                    <mrk mtype="seg"
                         mid="1331"/>
                </target>
            <sdl:seg-defs>It is scratched</sdl:seg-defs>
            </trans-unit>
            <trans-unit id="f">
                <source>I want to buy</source>
                <seg-source>
                    <mrk mtype="seg"
                         mid="1332">I want to buy</mrk>
                </seg-source>
                <target>
                    <mrk mtype="seg"
                         mid="1332"/>
                </target>
                <sdl:seg-defs>Some Matches</sdl:seg-defs>
            </trans-unit>
        </body>
    </file>
</xliff>

在这里 python 工作:

import xml.etree.ElementTree as ET

filetobeol = 'D:\Stack\example.xml'

srctrgmap = {'1328': 'Target Segment1328',
             '1330': 'Target Segment1330',
             '1332': 'Target Segment1332'
             }

tree = ET.parse(filetobeol)
beolroot = tree.getroot()
for tu in beolroot.findall(".//{urn:oasis:names:tc:xliff:document:1.2}trans-unit"):       
    ET.register_namespace("sdl", "http://sdl.com/FileTypes/SdlXliff/1.0")
    ET.register_namespace("", "urn:oasis:names:tc:xliff:document:1.2")
    for target in tu.findall("./{urn:oasis:names:tc:xliff:document:1.2}target"):
        for mrk in target.findall("./{urn:oasis:names:tc:xliff:document:1.2}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.keys():
                stillmrk = target.find("./{urn:oasis:names:tc:xliff:document:1.2}mrk")
                targetvalue = srctrgmap[mid]
                #print(targetvalue)
                stillmrk.text = str(targetvalue)
                print ("mrk is STILL element id: " + str(stillmrk))
                print ("new mrk text is: " +str(stillmrk.text))
            else:
                print("Segment Number " + str(mid) + " has no translation target text")
tree.write("D:\Stack\outexample.xml", encoding="utf-8", xml_declaration=True)