Разобрать документ xmi и сохранить иерархию - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть документ xmi от Enterprise Architect, похожий на этот

<?xml version="1.0" encoding="windows-1252"?>
<xmi:XMI xmi:version="2.1" xmlns:uml="http://schema.omg.org/spec/UML/2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1">
    <xmi:Documentation exporter="Enterprise Architect" exporterVersion="6.5"/>
    <uml:Model xmi:type="uml:Model" name="EA_Model" visibility="public">
        <packagedElement xmi:type="uml:Package" xmi:id="EAPK_C1A0B65B_00C2_4229_B332_B884E85F45E6" name="Starter Activity Diagram">
            <packagedElement xmi:type="uml:Activity" xmi:id="EAID_3DE279FE_1113_4dc6_B5A1_440947952118" name="Step 1"/>
            <packagedElement xmi:type="uml:Activity" xmi:id="EAID_5C10AB4B_9858_4c7a_9435_541ACEF8AD0D" name="Step 2"/>
            <packagedElement xmi:type="uml:Activity" xmi:id="EAID_130C1669_673C_4c2f_A113_7EC22D2BE1C9" name="Step 3">
                <packagedElement xmi:type="uml:Activity" xmi:id="EAID_58A61F14_EAED_44ed_8F03_CEE99A9B7B66" name="Step 3.1">
                    <packagedElement xmi:type="uml:Activity" xmi:id="EAID_DC23911F_5A80_4d9d_B5D7_0BEF15DF987E" name="Step 3.1.1"/>
                    <packagedElement xmi:type="uml:Activity" xmi:id="EAID_0E45CD9C_0F9A_4b55_A4CC_268C0D254C38" name="Step 3.1.2">
                        <packagedElement xmi:type="uml:Activity" xmi:id="EAID_F8D94AE5_10C5_4d71_B743_53E496052BEA" name="Step 3.1.2.1"/>
                        <packagedElement xmi:type="uml:Activity" xmi:id="EAID_CBC98C2D_E49C_43a1_B7B4_90768ADEC4D3" name="Step 3.1.2.2"/>
                        <packagedElement xmi:type="uml:Activity" xmi:id="EAID_E94810F8_3390_463c_B1B2_FECC0993CEFD" name="Step 3.1.2.3"/>
                    </packagedElement>
                </packagedElement>
                <packagedElement xmi:type="uml:Activity" xmi:id="EAID_03996F4A_3727_4c45_91A4_B2B8E768AA30" name="Step 3.2"/>
                <packagedElement xmi:type="uml:Activity" xmi:id="EAID_A78976E8_828D_4db7_98E2_20A44C9C982E" name="Step 3.3"/>
            </packagedElement>
            <packagedElement xmi:type="uml:Activity" xmi:id="EAID_F4B7134E_60C6_49e1_865D_0DF55B1B5562" name="Step 4"/>
            <packagedElement xmi:type="uml:Activity" xmi:id="EAID_BCAD3CA3_DE1C_466d_8B6C_31A0A8237E9A" name="Step 5"/>
            <packagedElement xmi:type="uml:Activity" xmi:id="EAID_AC000001_00C2_4229_B332_B884E85F45E6" name="Step 6">
            </packagedElement>
            <packagedElement xmi:type="uml:Class" xmi:id="EAID_8C73CF8B_A1ED_4ecf_9430_AEC994775AD1"/>
        </packagedElement>
    </uml:Model>
</xmi:XMI>

Я хочу создать список таких словарей

data = [
  {'entrynumber': 1,  'level': 1, 'name': 'Step 1'},
  {'entrynumber': 2,  'level': 1, 'name': 'Step 2'},
  {'entrynumber': 3,  'level': 1, 'name': 'Step 3'},
  {'entrynumber': 4,  'level': 2, 'name': 'Step 3.1'},
  {'entrynumber': 5,  'level': 3, 'name': 'Step 3.1.1'},
  {'entrynumber': 6,  'level': 3, 'name': 'Step 3.1.2'},
  {'entrynumber': 7,  'level': 4, 'name': 'Step 3.1.2.1'},
  {'entrynumber': 8,  'level': 4, 'name': 'Step 3.1.2.2'},
  {'entrynumber': 9,  'level': 4, 'name': 'Step 3.1.2.3'},
  {'entrynumber': 10, 'level': 2, 'name': 'Step 3.2'},
  {'entrynumber': 11, 'level': 2, 'name': 'Step 3.3'},
  {'entrynumber': 12, 'level': 1, 'name': 'Step 4'},
  {'entrynumber': 13, 'level': 1, 'name': 'Step 5'},
  {'entrynumber': 14, 'level': 1, 'name': 'Step 6'}]

Я знаю, как проанализировать xmi с помощью python с использованием xmldom.minidom. Моя основа - эти строки кода

def getName(xmldoc):
    data = []
    for element in xmldoc.getElementsByTagName("packagedElement"):
        new = element.getAttribute('name')
        data.append(new)
    return data

Но моя проблема в том, что я не знаю, как мне сохранить иерархию в документе. Насколько я знаю, функция getElementsByTagName просто дает вам все имена элементов, не заботясь об уровнях.

...