Объединить XML-файл и список словаря Python в один файл Python - PullRequest
0 голосов
/ 17 октября 2019

Я хочу создать файл XML, используя следующий список словарей и XML_file_1

Это словарь

[{'@name': 'has', '@degree': 'binary', '@type': 'one_to_one', 'member1': {'@name': 'employee', '@cardinality': 'one', '@primary_key': 'number'}, 'member2': {'@name': 'department', '@cardinality': 'one', '@primary_key': 'number'}}, {'@name': 'began_managing', '@degree': 'binary', '@type': 'one_to_one', 'member1': {'@name': 'department', '@cardinality': 'one', '@primary_key': 'number'}, 'member2': {'@name': 'employee', '@cardinality': 'one', '@primary_key': 'number'}}, {'@name': 'controls', '@degree': 'binary', '@type': 'one_to_many', 'member1': {'@name': 'projects', '@cardinality': 'many', '@primary_key': 'number'}, 'member2': {'@name': 'department', '@cardinality': 'one', '@primary_key': 'number'}}, {'@name': 'is_assigned', '@degree': 'binary', '@type': 'one_to_one', 'member1': {'@name': 'department', '@cardinality': 'one', '@primary_key': 'number'}, 'member2': {'@name': 'employee', '@cardinality': 'one', '@primary_key': 'number'}}, {'@name': 'is_working', '@degree': 'binary', '@type': 'one_to_one', 'member1': {'@name': 'project', '@cardinality': 'one', '@primary_key': 'number'}, 'member2': {'@name': 'employee', '@cardinality': 'one', '@primary_key': 'number'}}, {'@name': 'related_with', '@degree': 'binary', '@type': 'one_to_many', 'member1': {'@name': 'employee', '@cardinality': 'one', '@primary_key': 'number'}, 'member2': {'@name': 'dependents', '@cardinality': 'many', '@primary_key': 'number'}}]

Это XML_file_1

    ?xml version="1.0"?>
<er name="company">
    <entity name="employee">
        <attribute name="number" value="primary_key"/>
        <attribute name="name" type="composite_parent" />
        <attribute name="first_name" type="composite_child"/>
        <attribute name="middle_name" type="composite_child"/>
        <attribute name="last_name" type="composite_child"/>
        <attribute name="salary"/>
        <attribute name="address"/>
        <attribute name="gender"/>
        <attribute name="date_of_birth"/>
    </entity>

</er>

Ожидаемый результат:

<?xml version="1.0"?>
<er name="company">
    <entity name="employee">
        <attribute name="number" value="primary_key"/>
        <attribute name="name" type="composite_parent" />
        <attribute name="first_name" type="composite_child"/>
        <attribute name="middle_name" type="composite_child"/>
        <attribute name="last_name" type="composite_child"/>
        <attribute name="salary"/>
        <attribute name="address"/>
        <attribute name="gender"/>
        <attribute name="date_of_birth"/>
    </entity>
    .....
    <relation name="work" degree="binary" type="many_to_many">
        <member1 name="employee" cardinality="many" primary_key = "number"/>
        <member2 name="project" cardinality="many" primary_key = "number"/>
        <attribute name="hours_per_week"/>
    </relation>

    <relation name="assign" degree="binary" type="one_to_many">
        <member1 name="employee" cardinality="many" primary_key = "number"/>
        <member2 name="department" cardinality="one" primary_key = "number"/>
    </relation>
 ......
</er>

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

    <?xml version="1.0" encoding="utf-8"?>
<er>
    .....
    <relation name="controls" degree="binary" type="one_to_many">
        <member1 name="projects" cardinality="many" primary_key="number"></member1>
        <member2 name="department" cardinality="one" primary_key="number"></member2>
    </relation>
    <relation name="related_with" degree="binary" type="one_to_many">
        <member1 name="employee" cardinality="one" primary_key="number"></member1>
        <member2 name="dependents" cardinality="many" primary_key="number"></member2>
    </relation>

.....

Код:

output_dic = {'er':{'relation':relation}}

with open('new_data_2.json', 'w+') as json_file:
    json.dump(output_dic, json_file, indent=4, sort_keys=True)

output_xml = xmltodict.unparse(output_dic, pretty=True)

with open('output.xml', 'w+') as xml_file:
    xml_file.write(output_xml)

Затем я пытаюсь объединить эти два файла XML вместе, но японятия не имею, как его записать в файл.

Код для объединения XML-файлов:

def run(folder):
files = glob.glob(folder + "/*.xml")
first = None

for filename in files:
    data = ElementTree.parse(filename).getroot()
    if first is None:
        first = data
    else:
        first.extend(data)
if first is not None:
    print(ElementTree.tostring(first))

Пожалуйста, дайте мне некоторую идею для создания ожидаемого вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...