Объединение двух XML-файлов с помощью метаданных (дата) в случае возникновения конфликтов - PullRequest
0 голосов
/ 19 апреля 2019

Я хочу объединить два 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'))
...