Python XML здание - PullRequest
       8

Python XML здание

0 голосов
/ 23 февраля 2020

Я пытаюсь построить xml из python, как l oop в подэлементах? Я пытался получить его в необходимом формате, но не могу понять, как

Вывод, который я получаю, это:

b'<member x0="28.921" y0="710.377" text="1. Case gdfh "><sub/></member>'
b'<member><sub x0="54.721" y0="695.792" text="Version "> 0</sub></member>'
b'<member><sub x0="54.721" y0="688.112" text="AER Number "> 4735986</sub></member>'
b'<member><sub x0="54.721" y0="680.792" text="Initial Unit "> SBFBKJSF</sub></member>'
b'<member x0="28.921" y0="561.937" text="2. Patient"><sub/></member>'
b'<member><sub x0="54.721" y0="510.697" text="Patient Information"></sub></member>'
b'<member><sub x0="54.721" y0="496.112" text="Age "> 60 Years</sub></member>'
b'<member><sub x0="54.721" y0="488.432" text="Height "> 171 Centimeter</sub></member>'

Вывод, который я хочу это:

b'
<member x0="28.921" y0="710.377" text="1. Case gdfh ">
    <sub x0="54.721" y0="695.792" text="Version "> 0</sub>
    <sub x0="54.721" y0="688.112" text="AER Number "> 4735986</sub>
    <sub x0="54.721" y0="680.792" text="Initial Unit "> SBFBKJSF</sub>
</member>
<member x0="28.921" y0="561.937" text="2. Patient">
    <sub x0="54.721" y0="510.697" text="Patient Information"></sub>
    <sub x0="54.721" y0="496.112" text="Age "> 60 Years</sub>
    <sub x0="54.721" y0="488.432" text="Height "> 171 Centimeter</sub>
</member>
'

Код, который я пишу: эти значения

TEXT                   x0       y0 
['1. Case gdfh ', ''] 28.921 , 710.377
['Version ', ' 0', ''] 54.721 , 695.792
['AER Number ', ' 4735986', ''] 54.721 , 688.112
['Initial Unit ', 'SBFBKJSF ', ''] 54.721 , 680.792
['2. Patient', ''] 28.921 , 561.937
['Patient Information', ''] 54.721 , 510.697
['Age ', ' 60 Years', ''] 54.721 , 496.112
['Height ', ' 171 Centimeter', ''] 54.721 , 488.432

1 Ответ

0 голосов
/ 23 февраля 2020

Вы хотите новый member каждый раз, когда значение x0 равно '28.921', и в любом другом случае вы хотите добавить подчиненный элемент к тому, чем current member является - если нет текущего члена, что может произойти, если первый элемент в st не x0 == '28.921'.

from lxml import etree

class betterdict(dict):
    def __getattr__(self, key):
        return self.get(key)

st = [
    betterdict({'text': ['1. Case gdfh ', ''],              'x0': '28.921', 'y0': '710.377'}),
    betterdict({'text': ['Version ', ' 0', ''],             'x0': '54.721', 'y0': '695.792'}),
    betterdict({'text': ['AER Number ', ' 4735986', ''],    'x0': '54.721', 'y0': '688.112'}),
    betterdict({'text': ['Initial Unit ', 'SBFBKJSF ', ''], 'x0': '54.721', 'y0': '680.792'}),
    betterdict({'text': ['2. Patient', ''],                 'x0': '28.921', 'y0': '561.937'}),
    betterdict({'text': ['Patient Information', ''],        'x0': '54.721', 'y0': '510.697'}),
    betterdict({'text': ['Age ', ' 60 Years', ''],          'x0': '54.721', 'y0': '496.112'}),
    betterdict({'text': ['Height ', ' 171 Centimeter', ''], 'x0': '54.721', 'y0': '488.432'}),
]

root = etree.Element('root')
member = None

for j in st:
    if j.x0 == '28.921':
        member = etree.SubElement(root, 'member')
        member.attrib['x0'] = j.x0
        member.attrib['y0'] = j.y0
        member.attrib['text'] = j.text[0]
    elif member is not None:
        submbr = etree.SubElement(member, 'sub')
        submbr.attrib['x0'] = j.x0
        submbr.attrib['y0'] = j.y0
        submbr.attrib['text'] = j.text[0]
        submbr.text = j.text[1]

out = etree.tostring(root)
print(out)

печатает именно то, что вы хотите (отформатированный для удобства чтения)

<root>
  <member x0="28.921" y0="710.377" text="1. Case gdfh ">
    <sub x0="54.721" y0="695.792" text="Version "> 0</sub>
    <sub x0="54.721" y0="688.112" text="AER Number "> 4735986</sub>
    <sub x0="54.721" y0="680.792" text="Initial Unit ">SBFBKJSF </sub>
  </member>
  <member x0="28.921" y0="561.937" text="2. Patient">
    <sub x0="54.721" y0="510.697" text="Patient Information"></sub>
    <sub x0="54.721" y0="496.112" text="Age "> 60 Years</sub>
    <sub x0="54.721" y0="488.432" text="Height "> 171 Centimeter</sub>
  </member>
</root>
...