使用相同节点在python中将XML解析为数据帧

使用相同节点在python中将XML解析为数据帧,python,parsing,pandas,dataframe,lxml,Python,Parsing,Pandas,Dataframe,Lxml,我有这个XML,我想解析成panda的数据框架: <DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> <CPE>PT0002000022161425NP</CPE> <CPE>PT0002000022161458JH</CPE> <

我有这个XML,我想解析成panda的数据框架:

<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO>   
  <CPE>PT0002000022161425NP</CPE>
  <CPE>PT0002000022161458JH</CPE>
  <CPE>PT0002000022161471ZP</CPE>
  <CPE>PT0002000022161505SL</CPE>
</DISTRITO>
问题是,当我得到结果时,它只返回最后一个节点“”值:

我对XML文件进行了一些研究,发现当节点的名称相同时,就会发生这种情况。例如,如果我的文件是:

  <DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO>   
  <CPE1>PT0002000022161425NP</CPE1>
  <CPE2>PT0002000022161458JH</CPE2>
  <CPE3>PT0002000022161471ZP</CPE3>
  <CPE4>PT0002000022161505SL</CPE4>
</DISTRITO>

布拉干卡
PT000200002161425NP
PT000200002161458JH
PT000200002161471ZP
PT000200002161505SL
不会有任何问题的。我一直在寻找,但我找不到解决办法。如果你能帮我找到另一种方法来解析这个文件,因为我无法让它正常工作


谢谢你们

您有两个问题,首先,如果您在内部循环中有重复的键,那么您将覆盖值;同时,您还将向循环中的同一dict/对象添加一个引用,因此您所做的任何更改都会反映在所有位置,因此每次只会看到最后一个值

您需要在内部循环中创建dict,以便每次添加一个新对象:

 for child in root.getchildren():
    data.append({child.tag: child.pyval})
上面将给出所有的值,我不确定您想要的确切格式,因为我不太明白您的循环应该做什么。这可能接近您想要的:

x = """<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO>
  <CPE>PT0002000022161425NP</CPE>
  <CPE>PT0002000022161458JH</CPE>
  <CPE>PT0002000022161471ZP</CPE>
  <CPE>PT0002000022161505SL</CPE>
</DISTRITO>"""

root = etree.fromstring(x)
from lxml import objectify
import pandas as pd

root = objectify.fromstring(x)


df = pd.DataFrame(((child.tag, child.pyval) for child in root.getchildren()))

print(df)

谢谢你的回复。我只是想了解一下etree、objectify以及如何用Python将XML解析为数据帧。我有一个巨大的XML文件,我想把它转换成表格文件,以便更好地阅读。谢谢你帮了我很多
 for child in root.getchildren():
    data.append({child.tag: child.pyval})
x = """<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO>
  <CPE>PT0002000022161425NP</CPE>
  <CPE>PT0002000022161458JH</CPE>
  <CPE>PT0002000022161471ZP</CPE>
  <CPE>PT0002000022161505SL</CPE>
</DISTRITO>"""

root = etree.fromstring(x)
from lxml import objectify
import pandas as pd

root = objectify.fromstring(x)


df = pd.DataFrame(((child.tag, child.pyval) for child in root.getchildren()))

print(df)
                      0         1
0         NOME_DISTRITO  BRAGANCA
1  PT0002000022161425NP       CPE
2  PT0002000022161458JH       CPE
3  PT0002000022161471ZP       CPE
4  PT0002000022161505SL       CPE