【问题标题】:Add parent element to child element to have one tuple (when converting XML to dictionary collection)将父元素添加到子元素以具有一个元组(将 XML 转换为字典集合时)
【发布时间】:2022-01-13 09:36:01
【问题描述】:

我的临时问题涉及以下内容

给定这个 xml 结构(保存在 xml_FILE 中):

<countriesAndStates>
  <countries>
    <name>USA</name>
    <states>
      <active>true</active>
      <stateName>Colorado</stateName>
      <isoCode>CO</isoCode>
    </states>
    <states>
      <active>false</active>
      <stateName>Florida</stateName>
      <isoCode>FL</isoCode>
    </states>
  </countries>
</countriesAndStates>

我通过这个for循环遍历状态元素级别,并通过defaultdict集合的帮助将结果保存到列表字典中,如下所示:

from collections import defaultdict
tree = ET.parse(xml_FILE)
root = tree.getroot()
    
dict_of_list = defaultdict(list)
for key in root.findall("./countriesAndStates/"
                              "countries/"
                              "states/"):
    dict_of_list[key.tag].append(key.text)

然后我将这个 dict 转换为数据框,我将拥有包含状态元素数据的所有元组,参见:

df = pd.DataFrame(dict_of_list)
print(df)

这样我得到以下数据帧输出(方案+元组):

     active    stateName isoCode               
0    true      Colorado  CO       

但是,我希望每个州元组都有国家 这样数据框中的每个元组/行都将转换为:

    name  active    stateName isoCode               
0   USA   true      Colorado  CO  

换句话说:对于每个州/记录,我也想要国家名称。 我怎样才能做到这一点?

提前谢谢你。

【问题讨论】:

  • 上传 VALID xml 文档并显示所需的输出。
  • @balderman 给你,我尽力了
  • 你能在例子中添加另一个状态吗?
  • @balderman 当然,你去,提前感谢

标签: python xml dictionary elementtree xml.etree


【解决方案1】:

类似的东西

import xml.etree.ElementTree as ET
import pandas as pd


xml = '''<countriesAndStates>
  <countries>
    <name>USA</name>
    <states>
      <active>true</active>
      <stateName>Colorado</stateName>
      <isoCode>CO</isoCode>
    </states>
    <states>
      <active>false</active>
      <stateName>Florida</stateName>
      <isoCode>FL</isoCode>
    </states>
  </countries>
</countriesAndStates>'''

data = []
root = ET.fromstring(xml)
for country in root.findall('.//countries'):
  name = country.find('name').text
  for state in country.findall('states'):
    data.append({'name':name})
    for e in list(state):
      data[-1][e.tag] = e.text
df = pd.DataFrame(data)
print(df)

输出

  name active stateName isoCode
0  USA   true  Colorado      CO
1  USA  false   Florida      FL

【讨论】:

  • 非常感谢!这样做的工作:)
  • 1) root.findall('.//countries') => root.findall('countries') 2) for e in list(state) => for e in state
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
相关资源
最近更新 更多