元素树不修改元素文本
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)
我正在使用 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)