Копирование атрибутов и текста из Xml файлов, возможно размещение в наборах? - PullRequest
0 голосов
/ 12 марта 2020

Я работал над способом разбора сотен документов для текста, которые обычно имеют атрибуты (параграф), которые разделяются на абзацы (фраза). Вот как они обычно разделяются:

Примечание: есть пространство имен :

<?xml version='1.0' encoding='UFT-8'?>
<doc xmlns="http://namespace.com/here/poems">
    <properties>
        <titles>
          <title>Name of Work</title>
        </titles>
        <authors>
         <author>John Smith</author>
        </authors>
    </properties>
    <work>
        <paragraph name="i1">
          <phrase> Lorem ipsum dolor sit amet,<br/> consectetur adipiscing elit,<br/>sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</phrase>
        </paragraph>
        <paragraph name="b1">
          <phrase>A quick<br/>brown fox</phrase>
        </paragraph>
        <paragraph name="b2">
          <phrase>Jumps over<br/>the lazy</br>dog</phrase>
        </paragraph>
        <paragraph name="c1">
          <phrase> Lorem ipsum dolor sit amet,<br/> consectetur adipiscing elit,<br/>sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</phrase>
        </paragraph>
    </work>
</doc>

Текст обычно сохраняется вместе в абзаце с именем атрибут (b1 соединяется с b2, добавляя строку до и после текста, отделяя ее от текста от отличающихся атрибутов), например, это будет желаемый результат:

Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

A quick
brown fox
Jumps over
the lazy
dog

Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Все кратные атрибуты одного и того же типа атрибута ([b1, b2, b3, ...] [i1, i2, i3, ...] и т. Д. c) должны быть соединены вместе, разделены line.

Все они различаются по количеству и порядку атрибутов. Есть ли способ сохранить этот формат без изменений (c атрибуты вместе, строка между ними, b вместе, строка между ними и т. Д. c)? Я возился с идеей наборов как способа их объединения, но не уверен в идее.

Заранее благодарим за любую помощь или совет!

1 Ответ

0 голосов
/ 13 марта 2020

Это немного долго, но работает, по крайней мере, для текста в вашем вопросе:

poetry = """
[your xml above; note that `the lazy</br>dog` should be `the lazy<br/>dog`]
"""
from lxml import etree
doc = etree.fromstring(poetry.replace("<?xml version='1.0' encoding='UFT-8'?>", "").replace(' xmlns="', ' xmlnamespace="'))
phrases = doc.xpath('//work//paragraph/phrase')

lines = []
hold = ''
for p in phrases:
    line = ''    
    cfl = p.getparent().attrib['name'][0]    
    if p.getparent().getnext() is None:
        for t in p.itertext():  
            if t not in hold:
                line+= hold+' ' + t+' '          
        lines.append(line.strip())      
    else:        
        nfl = p.getparent().getnext().attrib['name'][0]             
        if cfl == nfl :
            for t in p.itertext():  
                if t not in hold:                    
                    hold+= t+' '                   
        else:
            for t in p.itertext():  
                if t not in hold:
                    line+= hold+' ' + t+' '       
                    hold = ''
            lines.append(line.strip())                  
for line in lines:
    print(line)

Вывод:

Lorem ipsum dolor sit amet,   consectetur adipiscing elit,  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

A quick brown fox  Jumps over  the lazy  dog

Lorem ipsum2 dolor sit amet,   consectetur adipiscing elit,  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
...