【问题标题】:Convert XML to pandas dataframe将 XML 转换为 pandas 数据框
【发布时间】:2020-05-08 10:29:07
【问题描述】:

我想将 XML 转换为 pandas DataFrame。我使用ElementTree 库来解析XML。

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

xtree = et.parse('xmlfile.xml)
xroot = xtree.getroot() 

[elem.tag for elem in xroot.iter()]

如何访问每个标签的值,以便将 XML 转换为 pandas 数据框?

Dataframe 应该如下所示:

以下面的XML为例,你能想出一些Python代码来实现上面的DataFrame吗?

<?xml version="1.0" encoding="UTF-8"?>

<!-- Deze grammatica wordt niet meer gebruikt. Gebruik voortaan FMPXMLRESULT. -->

-<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">

<ERRORCODE>0</ERRORCODE>

<DATABASE>FrontEnd.fmp12</DATABASE>

<LAYOUT/>


-<ROW RECORDID="183122" MODID="0">

<identificatie>GAC</identificatie>

<naam>sample_naam_1</naam>

<wachtwoord>ww</wachtwoord>

<kenmerk>km</kenmerk>

<timestamp>30-4-2020 13:51:05</timestamp>

<berichtversie>1.0</berichtversie>

<analysecode>BST200428</analysecode>

<datum>30-4-2020</datum>

<datumontvangst>28-4-2020</datumontvangst>


</ROW>


-<ROW RECORDID="183123" MODID="0">

<identificatie>GAC</identificatie>

<naam>sample_naam_2</naam>

<wachtwoord>ww</wachtwoord>

<kenmerk>km</kenmerk>

<timestamp>30-4-2020 13:51:05</timestamp>

<berichtversie>1.0</berichtversie>

<analysecode>BST200429</analysecode>

<datum>30-4-2020</datum>

<datumontvangst>28-4-2020</datumontvangst>


</ROW>

</FMPDSORESULT>

【问题讨论】:

  • 您的数据格式不正确。请重新检查
  • 对不起,我没有完全复制 XML,我只是更改了它
  • 仍然给我错误 - 例如你的布局部分有一个没有相关开头的结尾......我不确定其他错误是什么。为了安全起见,将这段数据作为字符串运行,看看它是否给出任何错误

标签: python xml pandas


【解决方案1】:

我已经为类似的用例制作了一个包。它也可以在这里工作。

pip install pandas_read_xml

你可以做类似的事情

import pandas_read_xml as pdx

df = pdx.read_xml('filename.xml', ['FMPDSORESULT'])

要变平,你可以

df = pdx.flatten(df)

df = pdx.fully_flatten(df)

【讨论】:

    【解决方案2】:

    您可以使用xmltodict 解析您的 XML,然后创建一个数据框。

    试试这个:

    import pandas as pd
    import xmltodict
    
    data = """
    <?xml version='1.0' encoding='UTF-8'?>
    <FMPDSORESULT xmlns='http://www.filemaker.com/fmpdsoresult'>
    <ERRORCODE>0</ERRORCODE>
    <DATABASE>FrontEnd.fmp12</DATABASE>
    <LAYOUT/>
    <ROW RECORDID='183122' MODID='0'>
    <identificatie>GAC</identificatie>
    <naam>sample_naam_1</naam>
    <wachtwoord>ww</wachtwoord>
    <kenmerk>km</kenmerk>
    <timestamp>30-4-2020 13:51:05</timestamp>
    <berichtversie>1.0</berichtversie>
    <analysecode>BST200428</analysecode>
    <datum>30-4-2020</datum>
    <datumontvangst>28-4-2020</datumontvangst>
    </ROW>
    <ROW RECORDID='183123' MODID='0'>
    <identificatie>GAC</identificatie>
    <naam>sample_naam_2</naam>
    <wachtwoord>ww</wachtwoord>
    <kenmerk>km</kenmerk>
    <timestamp>30-4-2020 13:51:05</timestamp>
    <berichtversie>1.0</berichtversie>
    <analysecode>BST200429</analysecode>
    <datum>30-4-2020</datum>
    <datumontvangst>28-4-2020</datumontvangst>
    </ROW>
    </FMPDSORESULT>
    """
    
    parsed = xmltodict.parse(data.strip())
    df = pd.DataFrame(parsed["FMPDSORESULT"]["ROW"])
    display(df)
    

    打印出来:

        @RECORDID   @MODID  identificatie   naam    wachtwoord  kenmerk     timestamp   berichtversie   analysecode     datum   datumontvangst
    0   183122  0   GAC     sample_naam_1   ww  km  30-4-2020 13:51:05  1.0     BST200428   30-4-2020   28-4-2020
    1   183123  0   GAC     sample_naam_2   ww  km  30-4-2020 13:51:05  1.0     BST200429   30-4-2020   28-4-2020
    

    请注意,我必须进一步清理您的 XML 并将所有括号 (") 交换为单个括号 (')。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2019-05-14
      • 2022-01-20
      • 2021-03-25
      • 2014-08-19
      相关资源
      最近更新 更多