Я хочу объединить два XML-файла (фактически файлы TMX памяти переводов) с оговоркой, что два файла могут содержать две версии записи. Формат файла примерно такой:
file1.tmx
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tmx SYSTEM "tmx11.dtd">
<tmx version="1.1">
<header creationtool="OmegaT" o-tmf="OmegaT TMX" adminlang="EN-US" datatype="plaintext" creationtoolversion="4.1.5_0_10418" segtype="paragraph" srclang="ZH-CN"/>
<body>
<tu>
<tuv lang="ZH-CN">
<seg>SourceEntryToBeTranslated1</seg>
</tuv>
<tuv lang="EN-US" changeid="user" changedate="20190119T074530Z">
<seg>I is John.</seg>
</tuv>
</tu>
<tu>
<tuv lang="ZH-CN">
<seg>SourceEntryToBeTranslated2</seg>
</tuv>
<tuv lang="EN-US" changeid="user" changedate="20190119T075550Z">
<seg>Other Entry 2</seg>
</tuv>
</tu>
</body>
</tmx>
file2.tmx
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tmx SYSTEM "tmx11.dtd">
<tmx version="1.1">
<header creationtool="OmegaT" o-tmf="OmegaT TMX" adminlang="EN-US" datatype="plaintext" creationtoolversion="4.1.5_0_10418" segtype="paragraph" srclang="ZH-CN"/>
<body>
<tu>
<tuv lang="ZH-CN">
<seg>SourceEntryToBeTranslated1</seg>
</tuv>
<tuv lang="EN-US" changeid="user" changedate="20190415T064114Z">
<seg>I am John.</seg>
</tuv>
</tu>
<tu>
<tuv lang="ZH-CN">
<seg>SourceEntryToBeTranslated3</seg>
</tuv>
<tuv lang="EN-US" changeid="user" changedate="20190119T074550Z">
<seg>Other Entry 3</seg>
</tuv>
</tu>
</body>
</tmx>
Желаемый вывод:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tmx SYSTEM "tmx11.dtd">
<tmx version="1.1">
<header creationtool="OmegaT" o-tmf="OmegaT TMX" adminlang="EN-US" datatype="plaintext" creationtoolversion="4.1.5_0_10418" segtype="paragraph" srclang="ZH-CN"/>
<body>
<tu>
<tuv lang="ZH-CN">
<seg>SourceEntryToBeTranslated</seg>
</tuv>
<tuv lang="EN-US" changeid="user" changedate="20190415T064114Z">
<seg>I am John.</seg>
</tuv>
</tu>
<tu>
<tuv lang="ZH-CN">
<seg>SourceEntryToBeTranslated2</seg>
</tuv>
<tuv lang="EN-US" changeid="user" changedate="20190119T075550Z">
<seg>Other Entry 2</seg>
</tuv>
</tu>
<tu>
<tuv lang="ZH-CN">
<seg>SourceEntryToBeTranslated3</seg>
</tuv>
<tuv lang="EN-US" changeid="user" changedate="20190119T074550Z">
<seg>Other Entry 3</seg>
</tuv>
</tu>
</body>
</tmx>
Я могу использовать xml.etree.ElementTree
для объединения файлов, но тогда это будет зависеть от порядка, в котором я объединяю файлы, приводя к различным версиям. Обратите внимание, что метаданные changedate
на самом деле содержат метку даты и времени.
Я не уверен, как проанализировать деревья элементов, чтобы фактически взять «последнюю» версию записи при слиянии.
from xml.etree import ElementTree
def run(files):
first = None
for filename in files:
data = ElementTree.parse(filename).getroot()
if first is None:
first = data
else:
first.extend(data)
if first is not None:
print(ElementTree.tostring(first,encoding='UTF-8'))