【问题标题】:Read XML data into a dictionary将 XML 数据读入字典
【发布时间】:2018-03-02 09:30:53
【问题描述】:

我有一个小的 XML 片段,如下所示。我想得到:

  • 组名属性
  • groupname对应的groupfilter表达式属性

我需要将这些值显示为表格,因此组名的对应表达式是必须的。

我的 XML 文件:

<datas xmlns:user="http://tempuri.org">
  <data>
    <group name='[Action (Market Size,Market,Product Type,Product)]' name-style='unqualified' user:auto-column='sheet_link'>
      <groupfilter function='crossjoin'>
        <groupfilter function='level-members' level='[Market Size]' />
        <groupfilter function='level-members' level='[Market]' />
        <groupfilter function='level-members' level='[Product Type]' />
        <groupfilter function='level-members' level='[Product]' />
      </groupfilter>
    </group>
    <group name='[Action (Market,Product Type,Product)]' name-style='unqualified' user:auto-column='sheet_link'>
      <groupfilter function='crossjoin'>
        <groupfilter function='level-members' level='[Market]' />
        <groupfilter function='level-members' level='[Product Type]' />
        <groupfilter function='level-members' level='[Product]' />
      </groupfilter>
    </group>
     <group name='[Set 1 sanu]' name-style='unqualified' user:ui-builder='filter-group'>
      <groupfilter expression='SUM([COGS]) == 0.' function='filter' user:ui-filter-by-field='true' user:ui-marker='filter-by'>
        <groupfilter function='level-members' level='[Product Line]' user:ui-enumeration='all' user:ui-marker='enumerate' />
      </groupfilter>
    </group>
    <group name='[Action (Category,Region,Sub-Category (group))]' name-style='unqualified' user:auto-column='sheet_link'>
      <groupfilter function='crossjoin'>
        <groupfilter function='level-members' level='[Product Category]' />
        <groupfilter function='level-members' level='[Region]' />
        <groupfilter function='level-members' level='[Sub-Category (group)]' />
      </groupfilter>
    </group>
    <group caption='Top Customers by Profit' name='[Set 1]' name-style='unqualified' user:ui-builder='filter-group'>
      <groupfilter count='[Parameters].[Parameter 2]' end='top' function='end' units='records' user:ui-marker='end' user:ui-top-by-field='true'>
        <groupfilter direction='DESC' expression='SUM([Profit])' function='order' user:ui-marker='order'>
          <groupfilter function='level-members' level='[Customer Name]' user:ui-enumeration='all' user:ui-marker='enumerate' />
        </groupfilter>
      </groupfilter>
    </group>
  </data>
</datas>

我的尝试:

(root1是etree解析xml为文件的根元素)

for setvar in root1.findall('.//group'):
    setname.append(setvar.get('name'))
    groupfilter = setvar.findall('.//groupfilter')
    if groupfilter:
        for i in groupfilter:
            if i.get('expression'):
                setexpression.append(i.get('expression'))
             else:
                 setexpression.append('')

为了将结果显示为表格,我将它们附加到list。是否可以将这两个数据提取为字典中的键值对?

【问题讨论】:

    标签: python python-3.x xml-parsing elementtree


    【解决方案1】:

    无需转换为字典或列表。只需使用 XML 树作为您的基本数据结构。

    for group in tree.iterfind('.//group'):
        for groupfilter in group.iterfind('.//groupfilter[@expression]'):
            groupname = group.get('name')
            expression = groupfilter.get('expression')
    
            print([groupname, expression])
    

    这只会选择实际具有expressiongroupfilter 元素。

    遍历所有groupfilter 元素同样容易:

    for group in tree.iterfind('.//group'):
        for groupfilter in group.iterfind('.//groupfilter'):
            groupname = group.get('name')
            expression = groupfilter.get('expression', '')  # default: empty string
    
            print([groupname, expression])
    

    【讨论】:

    • 获取名称和表达式@Tomalak的重复值
    • 第二个代码示例?你当然知道。当您查看您的 XML 片刻时,您就会明白为什么。
    • 是的,有多个组过滤器。但是如果找不到表达式属性,我可以设置一些条件来返回 null('') 吗? @Tomalak
    • 如果您只想选择顶级&lt;groupfilter&gt;元素,而不是嵌套元素,请使用'./groupfilter'而不是'.//groupfilter'
    • Python 中没有null,但是有None。如果您访问未定义的属性,.get() 将返回 None,但在您的问题中,您似乎想要一个空字符串,所以这就是我的代码所做的。你会弄清楚要改变什么。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多