Python XML элемент дерева в дамп JSON - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь сбросить дерево XML в JSON.

xml = """<MODEL>
 <RULE COMMENT="" DEFAULTPRIORITY="50" DESCRIPTION="Equipment" RULECLASSIFICATION="ASSIGN" TRIGGER="1">
            <BOOLOP BOOLOP="and" SEQ="0" TYPE="0">
                <BOOLOP BOOLOP="or" SEQ="1" TYPE="0">
                    <FRAGMENT FUNC1="value" FUNC2="literal" NULLACTION="Fragment is false" OP="=" PROP1="TYPE" PROP2="PURCHASE" SEQ="1" TYPE="1"/>
                    <FRAGMENT FUNC1="value" FUNC2="literal" NULLACTION="Fragment is false" OP="=" PROP1="TYPE" PROP2="LEASE" SEQ="2" TYPE="1"/>
                </BOOLOP>
                <BOOLOP BOOLOP="or" SEQ="4" TYPE="0">
                    <FRAGMENT FUNC1="value" FUNC2="propval" NULLACTION="Fragment is false" OP="=" PROP1="PICK_SKU1" PROP2="._sku" SEQ="1" TYPE="1"/>
                    <FRAGMENT FUNC1="value" FUNC2="propval" NULLACTION="Fragment is false" OP="=" PROP1="PICK_SKU10" PROP2="._sku" SEQ="2" TYPE="1"/>
                </BOOLOP>
            </BOOLOP>
            <ACTION FORMULA="1" PROPNAME="" PROPVALUE="" SEQ="0" TYPE="1">
                <LOCALES/>
                <ACTIONITEM SEQ="0" item="." max="1" min="0" qty="1"/>
            </ACTION>
        </RULE>


  <RULE COMMENT="" DEFAULTPRIORITY="50" DESCRIPTION="PickIfInviewAccountingSelected">
            <BOOLOP BOOLOP="and" SEQ="0" TYPE="0">
                <FRAGMENT FUNC1="value" FUNC2="literal" NULLACTION="Fragment is false" OP="=" PROP1="WSelected" PROP2="Web" SEQ="1" TYPE="1"/>
                <FRAGMENT FUNC1="propval" FUNC2="literal" NULLACTION="Fragment is false" OP="=" PROP1="ed" PROP2="1" SEQ="2" TYPE="1"/>
            </BOOLOP>
            <ACTION FORMULA="1" PROPNAME="" PROPVALUE="" SEQ="0" TYPE="1">
                <LOCALES/>
                <ACTIONITEM SEQ="0" item="." max="1" min="0" qty="1"/>
            </ACTION>
        </RULE> 
        </MODEL>    
        """

Сначала я пытаюсь вставить XML в словарь, перебирая его.

data={}
for movie in tree.findall("MODEL/RULE"):
    if movie.findall("./ACTION/ACTIONITEM/[@max='1']") and movie.findall("./ACTION/ACTIONITEM/[@min='0']") and movie.findall("./ACTION/ACTIONITEM/[@qty='1']"):
        #print(movie.attrib['NAME'])
        for child in movie.iter():
            if child.tag == 'BOOLOP'  or child.tag == 'FRAGMENT':
                data[movie.attrib['NAME']] = child.tag, child.attrib

А затем выгрузить словарь в JSON:

result = json.dumps(data, indent=4, sort_keys=True)
print(result)

Проблема, с которой я сталкиваюсь, заключается в том, что к элементу dict добавляется только тег FRAGMENT, а не тег BOOLOP.И если я удаляю условие if, то это выводит другой вывод все вместе.

Почему мой код не добавляет все в словарь.Это неправильный цикл или способ добавления в словарь?

Мой ожидаемый пример вывода JSON:

RULE
       {
          BOOLOP
                {
                  BOOLOP
                          {
                             FRAGMENT
                                       {
                                       }
                          }
                   BOOLOP
                          {
                              FRAGMENT
                                        {
                                        }
                          }
                  }
       }
...