我有一个xml文件,如下所示:
<?xml version="1.0"?>
<max:SyncObject xmlns:max="http://www.ibm.com/max">
<max:ObjectSet>
<max:PARENT action="AddChange">
<max:FIELD1>string</max:FIELD1>
<max:FIELD2>string</max:FIELD2>
<max:FIELD3>string</max:FIELD3>
<max:FIELD4>string</max:FIELD4>
<max:FIELD5>string</max:FIELD5>
<max:FIELD6>string</max:FIELD6>
<max:FIELD7>string</max:FIELD7>
<max:CHILD1 action="Ignored">
<max:CH1FIELD1 action="Ignored">
<max:CH1SUB1>string</max:CH1SUB1>
<max:CH1FIELD2>string</max:CH1FIELD2>
</max:CHILD1>
<max:CHILD2 action="Ignored">
<max:CH2FIELD1>string</max:CH2FIELD1>
</max:CHILD2>
</max:PARENT>
</max:ObjectSet>
</max:SyncObject>
我想达到的最终结果如下:
{'PARENT': ['FIELD1', 'FIELD2', 'FIELD3', 'FIELD4', 'FILED5', 'FIELD6', 'FIELD7', 'CHILD1', 'CHILD2']}, {'CHILD1': ['CH1FIELD1', 'CH1FIELD2'], 'CHILD2': ['CH2FIELD1'], 'CH1FIELD1':['CH1SUB1']}
所以我尝试了几种不同的方法从XML文件中提取FIELD1
,FIELD2
...标记,同时仍然保持结构,因为你可以看到PARENT
字典是与其余部分分开,并包含下面一个级别的所有标签。对于儿童标签也是如此。不需要动作属性,因为这将由类中的其他方式指定。
似乎大多数lxml和elementtree都是为了从XML标记中提取属性而不是标记本身。
有没有人能指出我在没有前缀,值或任何属性的情况下提取标记(FIELD NAMES)的正确方向并保留结构?
谢谢!
答案 0 :(得分:1)
首先,您的XML数据格式不正确,缺少结束</max:CH1FIELD1>
。
要将其转换为python数据结构,请使用xmltodict
:
import xmltodict
data = """<?xml version="1.0"?>
<max:SyncObject xmlns:max="http://www.ibm.com/max">
<max:ObjectSet>
<max:PARENT action="AddChange">
<max:FIELD1>string</max:FIELD1>
<max:FIELD2>string</max:FIELD2>
<max:FIELD3>string</max:FIELD3>
<max:FIELD4>string</max:FIELD4>
<max:FIELD5>string</max:FIELD5>
<max:FIELD6>string</max:FIELD6>
<max:FIELD7>string</max:FIELD7>
<max:CHILD1 action="Ignored">
<max:CH1FIELD1 action="Ignored">
<max:CH1SUB1>string</max:CH1SUB1>
<max:CH1FIELD2>string</max:CH1FIELD2>
</max:CH1FIELD1>
</max:CHILD1>
<max:CHILD2 action="Ignored">
<max:CH2FIELD1>string</max:CH2FIELD1>
</max:CHILD2>
</max:PARENT>
</max:ObjectSet>
</max:SyncObject>"""
d = xmltodict.parse(data,
process_namespaces=True,
namespaces={'http://www.ibm.com/max': None})
print d