Python XML元素树到JSON转储

时间:2019-03-04 08:33:25

标签: python xml python-3.x elementtree

我正在尝试将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)

我面临的问题是,它仅将xml中的FRAGMENT标签附加到dict而不是BOOLOP标签。如果我删除了if条件,那么它将一起输出不同的输出。

为什么我的代码没有将所有内容附加到字典中。循环是错误的还是我添加到字典的方式是?

我期望的示例JSON输出为:

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

0 个答案:

没有答案