如何解析按特定标签ID分组的XML

时间:2019-12-04 16:34:42

标签: python xml dataframe

我有以下xml文件,我想按表ID对其进行分组。

xml = """
 <Tables Count="19">
    <Table Id="1" >
      <Data>
        <Cell>
          <Brush/>
          <Text>AA</Text>
          <Text>BB</Text>
         </Cell>
       </Data>
    </Table>

    <Table Id="2" >
      <Data>
        <Cell>
          <Brush/>
          <Text>CC</Text>
          <Text>DD</Text>
         </Cell>
       </Data>
    </Table>
</Tables>
""" 

我想解析它并得到类似的东西。

enter image description here

我在下面尝试了一些方法,但无法弄清楚。

from lxml import etree

tree = etree.fromstring(xml)

users = {}
for user in tree.xpath("//Tables"):
    name = user.xpath("Table")[0].text
    users[name] = []
    for group in user.xpath("Data/Cell/Text"):
        users[name].append(group.text)

print (users)

有可能获得上述结果吗?如果是这样,有人可以帮助我做到这一点吗?非常感谢您的努力。

1 个答案:

答案 0 :(得分:1)

您需要将xpath查询更改为:

from lxml import etree

tree = etree.fromstring(xml)

users = {}
for user in tree.xpath("//Tables/Table"):
#                                ^^^
    name = user.attrib['Id']
    users[name] = []
    for group in user.xpath(".//Data/Cell/Text"):
    #                        ^^^
        users[name].append(group.text)

print (users)

...并使用attrib字典。
这将产生您的字符串:

{'1': ['AA', 'BB'], '2': ['CC', 'DD']}


如果您喜欢“单线”,甚至可以这样做:

users = {name: [group.text for group in user.xpath(".//Data/Cell/Text")]
         for user in tree.xpath("//Tables/Table")
         for name in [user.attrib["Id"]]}