【问题标题】:Python, XML Structure to DictionaryPython,XML结构到字典
【发布时间】:2015-04-25 08:08:19
【问题描述】:

我有一个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 文件中提取 FIELD1FIELD2... 标记,同时仍然保持结构,正如您所见,PARENT 字典与其他字典是分开的并包含所有标签正好低于一级。对于子标签也是如此。不需要动作属性,因为这将通过类中的另一种方式指定。

似乎大多数 lxml 和 elementtree 都倾向于从 XML 标签中提取属性,而不是标签本身。

谁能指出我在不带前缀、值或任何属性的情况下提取标签(字段名称)并保留结构的正确方向?

谢谢!

【问题讨论】:

    标签: python xml dictionary xml-parsing


    【解决方案1】:

    首先,您的 XML 数据格式不正确,缺少关闭 &lt;/max:CH1FIELD1&gt;

    要将其转换为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
    

    【讨论】:

    • 谢谢,你能解释一下这个返回什么以及如何操作它吗?
    • @txDMTN 当然,它返回一个OrderedDict 结构,您基本上可以将其作为普通字典进行操作,但它保留了顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2011-06-27
    • 2011-10-21
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多