#python #xml #python-3.x #lxml #xml.etree
#python #xml #python-3.x #lxml #xml.etree
Вопрос:
Я хочу объединить два 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'))
Комментарии:
1. Не изобретайте колесо заново. Существует утилита под названием «TMXMerger», упомянутая прямо на странице «OmegaT resources» .
2. TMXMerger не объединяет на основе последней даты. Я использовал его, и результат зависел от того, в каком порядке размещены файлы. Иногда объединенные файлы находятся в разных порядках (разные записи с разными датами), поэтому TMXMerger не работает для моего варианта использования.