Проблемы синтаксического анализа XML / XLIFF со встроенными элементами - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь проанализировать вариант xliff (XML) из программного обеспечения для перевода SDL Trados, которое содержит переводы, и файл "sdlxliff", который я анализирую, выглядит следующим образом (несколько упрощенный и "предварительно проверенный").

Обрабатываемый файл XML / XLIFF ("sample.sdlxliff"):

<?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="\\TRADOS_SERVER\Trados\2017\Doc_Helps\en-US\import\Test.xml" datatype="x-sdlfilterframework2" source-language="en-US" target-language="hr-HR"><header><sniff-info><detected-encoding detection-level="Certain" encoding="utf-8"/><detected-source-lang detection-level="Guess" lang="en-US"/><props><value key="xmlDeclaration">true</value><value key="standalone">yes</value><value key="HasUtf8Bom">false</value><value key="IsFragment">false</value></props></sniff-info></header>
<body>
  <trans-unit id="a1f4768e-a026-46c2-b65d-599d2108d176">
    <source>
      <g id="461">Add or edit text: </g>Just begin typing. The blinking insertion point indicates where your text starts. To edit text,   <g id="462">select the text</g>, then type. Use the controls in the Format <g id="463">  <g id="464"/></g> sidebar on the right.
    </source>
    <seg-source>
      <g id="461">
      <mrk mtype="seg" mid="182">Add or edit text:</mrk> </g>
      <mrk mtype="seg" mid="183">Just begin typing.</mrk> 
      <mrk mtype="seg" mid="184">The blinking insertion point indicates where your text starts.</mrk> 
      <mrk mtype="seg" mid="185">To edit text, <g id="462">select the text</g>, then type.</mrk> 
      <mrk mtype="seg" mid="186">Use the controls in the Format <g id="463"><g id="464"/></g> sidebar on the right.</mrk>
    </seg-source>
    <target>
      <g id="461">
      <mrk mtype="seg" mid="182">Dodajte ili uredite tekst:</mrk> </g>
      <mrk mtype="seg" mid="183">Samo počnite tipkati.</mrk> 
      <mrk mtype="seg" mid="184">Trepereća točka umetanja pokazuje gdje počinje vaš tekst.</mrk> 
      <mrk mtype="seg" mid="185">Za uređivanje teksta <g id="462">odaberite tekst</g>, zatim unesite tekst.</mrk> 
      <mrk mtype="seg" mid="186">Upotrijebite kontrole u rubnom stupcu Formatiraj <g id="463"><g id="464"/></g> s desne strane.</mrk>
    </target> 
    <blahblahblah></blahblahblah>
  </trans-unit>
  <trans-unit id="7f7ede5e-75b9-403a-b1c6-43f654ea8245">
    <source>
      <g id="492"><g id="493">The toolbar with buttons.</g></g>
    </source>
    <seg-source>
      <g id="492">
      <g id="493"> 
      <mrk mtype="seg" mid="199">The toolbar with buttons.</mrk></g></g>
    </seg-source>
    <target>
      <g id="492">
      <g id="493"> 
      <mrk mtype="seg" mid="199">Alatna traka sa tipkama.</mrk></g></g>
    </target>
    <blahblahblah></blahblahblah>
  </trans-unit>
</body>
</file></xliff>

Итак, файл XML / XLIFF имеет части "seg-source" и "target", которые меня интересуют и который я хочу извлечь, а затем распечатать в обычный текстовый файл с разделителями табуляции или что-то еще.

Однако у меня возникли проблемы со встроенными тегами - как в этой строке:

<mrk mtype="seg" mid="185">To edit text, <g id="462">select the text</g>, then type.</mrk> 

-> где я получаю только часть строки перед первым встроенным тегом '<g id="xxx">': (

Вместо " Чтобы редактировать текст, выделите текст, затем введите."Я получаю только" Для редактирования текста,".

Python код, который я пробовал:

# parsesdlxliff-test.py:

from lxml import etree

tree = etree.parse("sample.sdlxliff")
root = tree.getroot()

for element in root:
  pass # not important
  # now the children
  for all_tags in element.findall('.//'):
    if 'mrk' in all_tags.tag:
      attrs = all_tags.attrib
      numb = attrs.get("mid")
      # remove all internal tags within 'mrk', leave only clean string/text? - how?
      print(numb, all_tags.text)

Результат, который я получаю с этим код:

182 Add or edit text:
183 Just begin typing.
184 The blinking insertion point indicates where your text starts.
185 To edit text, 
186 Use the controls in the Format 
182 Dodajte ili uredite tekst:
183 Samo počnite tipkati.
184 Trepereća točka umetanja pokazuje gdje počinje vaš tekst.
185 Za uređivanje teksta 
186 Upotrijebite kontrole u rubnom stupcu Formatiraj 
199 The toolbar with buttons.
199 Alatna traka sa tipkama.

Как видно из результирующих строк № 185 и 186 («средние» цифры), после текста отсутствует текст Встроенный тег st (как в «seg-source», так и в «target»).

В конечном итоге, я хочу получить что-то вроде этого (только иллюстрация):

Add or edit text: <TAB> Dodajte ili uredite tekst:
To edit text, select the text, then type. <TAB> Za uređivanje teksta odaberite tekst, zatim unesite tekst.
Use the controls in the Format sidebar on the right. <TAB> Upotrijebite kontrole u rubnom stupcu Formatiraj s desne strane.

Т.е. разделенный табуляцией источник-цель предложение пары.

Я могу связать их позже, используя средние числа, но только после того, как мне удастся получить целые строки (как-то избавиться от внутренних тегов? ) ...

Короче говоря, как получить / извлечь целые строки, включая части после любых внутренних тегов '<gxxx>' или '</g>'?

1 Ответ

1 голос
/ 25 апреля 2020

Если я вас правильно понимаю, должно сработать что-то подобное:

import lxml.html as lh #while an xml parser would be more appropriate, in this case it's cleaner to use an html parser

diff = """[your xml above]"""
doc = lh.fromstring(diff.encode('utf-8'))
engs = []
cros = []
eng = doc.xpath('//seg-source//mrk')
cro = doc.xpath('//target//mrk')
for e in eng:
    engs.append(e.text_content())
for c in cro:
    cros.append(c.text_content())
for eng, cro in zip(engs, cros):
    print(eng, '<tab>',cro)

Вывод:

Add or edit text: <tab> Dodajte ili uredite tekst:
Just begin typing. <tab> Samo počnite tipkati.
The blinking insertion point indicates where your text starts. <tab> Trepereća točka umetanja pokazuje gdje počinje vaš tekst.
To edit text, select the text, then type. <tab> Za uređivanje teksta odaberite tekst, zatim unesite tekst.
Use the controls in the Format  sidebar on the right. <tab> Upotrijebite kontrole u rubnom stupcu Formatiraj  s desne strane.
The toolbar with buttons. <tab> Alatna traka sa tipkama.
...