Python XML构建

Python XML构建,python,lxml,Python,Lxml,我正在尝试从python构建xml,如何在子元素中循环? 我一直在努力使它的格式需要,但不知道如何 我得到的结果是: 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

我正在尝试从python构建xml,如何在子元素中循环? 我一直在努力使它的格式需要,但不知道如何

我得到的结果是:

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>'
数据结构、st列表在循环时具有这些值

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
每次x0的值等于“28.921”时,您都需要一个新成员,并且在任何其他情况下,您都需要向当前成员添加一个子成员,除非没有当前成员,当st中的第一项不是x0==“28.921”时,可能会发生这种情况

打印您想要的格式以便于阅读

0 4735986 SBFBKJSF 60年 171厘米
还请包括与您的样本匹配的数据结构st变量,但仅包括必要的部分,这样人们就不必为了在答案中提供测试代码而进行补充。也就是说,if:body和else:是相等的。无论在哪种情况下,当您执行相同的操作时,都不需要使用if/else。如果没有else:,它将提供不同的输出,不包括submemberah的值,查看输入数据将更容易理解。是的,这是我想要的,但上面的代码不起作用。,尝试it@user12637176问题的更新显示了输入数据是如何形成的。它不显示您的输入数据,也就是说,它不是我可以运行以获得与您相同的数据结构的Python代码。例如,“28.921”永远不会等于28.921。一个是字符串,另一个是数字。你的数据看起来像有数字。您的代码示例将其视为字符串。它是哪一个?同样,如果您不提供实际输入进行测试,我也无法对测试后的代码进行后期测试。@user12637176因此,我创建了一个数据结构,该结构可能与您所拥有的结构不同,也可能与您所拥有的结构不同,但它表明代码确实有效。是的。它是一个字符串,我匹配字符串,数据是列表形式而不是字典形式的,因为数据是重复的,我不能用dictionary@user12637176我已经向您展示了一个有效的解决方案。剩下的就看你了。
from lxml import etree
import xml.etree.ElementTree as xml


root = etree.Element('root')

for j in st:
    member = etree.SubElement(root, 'member')
    submbr = etree.SubElement(member, 'sub')

    if j.x0 == '28.921':
        root.append(member)
        member.append(submbr)
        member.attrib['x0'] = j.x0
        member.attrib['y0'] = j.y0
        member.attrib['text'] = j.text[0]
        member.text = j.text[1]
    else:
        submbr.attrib['x0'] = j.x0
        submbr.attrib['y0'] = j.y0
        submbr.attrib['text'] = j.text[0]
        submbr.text = j.text[1]



    out = etree.tostring(member)
    print(out)
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
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)