lxml (etree) - атрибуты Pretty Print корневого тега - PullRequest
0 голосов
/ 14 ноября 2018

Возможно ли в python довольно распечатать атрибуты корня?

Я использовал etree для расширения атрибутов дочернего тега, а затем переписал существующий файл новым содержимым.Однако во время первого поколения XML мы использовали шаблон, в котором атрибуты корневого тега были перечислены по одному в строке, и теперь с помощью etree мне не удается достичь того же результата.

Я нашелпохожие вопросы, но все они имели в виду учебник etree, который я считаю неполным.

Надеюсь, кто-то нашел решение для этого с помощью etree.

РЕДАКТИРОВАТЬ: Это для пользовательских XML, так что HTMLTidy (который был предложен в комментариях) не работает для этого.

Спасибо!

generated_descriptors = list_generated_files(generated_descriptors_folder)
counter = 0
for g in generated_descriptors:
    if counter % 20 == 0:
        print "Extending Descriptor # %s out of %s" % (counter, len(descriptor_attributes))

    with open(generated_descriptors_folder + "\\" + g, 'r+b') as descriptor:
        root = etree.XML(descriptor.read(), parser=parser)

        # Go through every ContextObject to check if the block is mandatory
        for context_object in root.findall('ContextObject'):
            for attribs in descriptor_attributes:
                if attribs['descriptor_name'] == g[:-11] and context_object.attrib['name'] in attribs['attributes']['mandatoryobjects']:
                    context_object.set('allow-null', 'false')
                elif attribs['descriptor_name'] == g[:-11] and context_object.attrib['name'] not in attribs['attributes']['mandatoryobjects']:
                    context_object.set('allow-null', 'true')

        # Sort the ContextObjects based on allow-null and their name
        context_objects = root.findall('ContextObject')
        context_objects_sorted = sorted(context_objects, key=lambda c: (c.attrib['allow-null'], c.attrib['name']))

        root[:] = context_objects_sorted

        # Remove mandatoryobjects from Descriptor attributes and pretty print
        root.attrib.pop("mandatoryobjects", None)
        # paste new line here


        # Convert to string in order to write the enhanced descriptor
        xml = etree.tostring(root, pretty_print=True, encoding="UTF-8", xml_declaration=True)

        # Write the enhanced descriptor
        descriptor.seek(0)  # Set cursor at beginning of the file
        descriptor.truncate(0)  # Make sure that file is empty
        descriptor.write(xml)

        descriptor.close()

    counter+=1
...