当前位置: 首页 > 知识库问答 >
问题:

将XML标签解析为熊猫数据框

郎翔
2023-03-14

我有如下的XML文件。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pbsCrew>
    <schedulePeriod>
        <startDate>2022-06-02</startDate>
        <endDate>2022-07-01</endDate>
    </schedulePeriod>
    <crewMembers>
        <crewMember>
            <id>12345</id>
            <firstName>John</firstName>
            <middleName>S</middleName>
            <lastName>Doe</lastName>
            <seniorityNumber>2</seniorityNumber>
            <base>DFW</base>
            <division>I</division>
            <seat>CA</seat>
            <flightQualification>
                <hitcities/>
                <monthlyMax>9983</monthlyMax>
                <volMax>0</volMax>
                <restricted75HrCities>
                    <city>
                        <code>GUC</code>
                    </city>
                    <city>
                        <code>MSO</code>
                    </city>
                    </city>
                </restricted75HrCities>
                <equipmentTypes>
                    <equipment>
                        <type>777</type>
                    </equipment>
                </equipmentTypes>
                <green>false</green>
                <isVaccinated>true</isVaccinated>
            </flightQualification>
            <bidQualification>
                <canBid>true</canBid>
                <canBeAwarded>true</canBeAwarded>
            </bidQualification>
        </crewMember>
        <crewMember>
            <id>22222</id>
            <firstName>JANE</firstName>
            <middleName>R</middleName>
            <lastName>DOE</lastName>
            <seniorityNumber>8</seniorityNumber>
            <base>DFW</base>
            <division>I</division>
            <seat>CA</seat>
            <flightQualification>
                <hitcities>
                    <hitcity>
                        <code>OAX</code>
                    </hitcity>
                    <hitcity>
                        <code>MSO</code>
                    </hitcity>
                    <hitcity>
                        <code>US</code>
                    </hitcity>
                </hitcities>
                <monthlyMax>7642</monthlyMax>
                <volMax>0</volMax>
                <restricted75HrCities/>
                <equipmentTypes>
                    <equipment>
                        <type>787</type>
                    </equipment>
                </equipmentTypes>
                <green>false</green>
                <trainerLineCheck>false</trainerLineCheck>
                <trainerLineIndoctrination>false</trainerLineIndoctrination>
                <isVaccinated>true</isVaccinated>
            </flightQualification>
            <bidQualification>
                <canBid>true</canBid>
                <canBeAwarded>true</canBeAwarded>
            </bidQualification>
        </crewMember>
   </crewMembers>
</pbsCrew>

我想解析crewMember标签,并从中获取id、姓氏、姓氏以及flightQualification中的iSaventured标签,所有这些都放在一个Pandas数据框中,如下所示:

我知道这将涉及一个for循环来检索firstName和lastName值,但在提取我需要的所有值时遇到困难。有没有快速的方法来做到这一点?

共有1个答案

郭曾笑
2023-03-14

虽然可以通过循环使用elementtree或lxml库来实现,但是使用pandas read_xml()方法并使用stylesheet属性也可以实现相同的目标。该属性指定用于转换原始xml的XSL样式表。在您的情况下,需要将其扁平化,使所有感兴趣的元素都包含在一个父元素中,作为一行。

下面是一个例子:

xml = '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pbsCrew>
    <schedulePeriod>
        <startDate>2022-06-02</startDate>
        <endDate>2022-07-01</endDate>
    </schedulePeriod>
    <crewMembers>
        <crewMember>
            <id>12345</id>
            <firstName>John</firstName>
            <middleName>S</middleName>
            <lastName>Doe</lastName>
            <seniorityNumber>2</seniorityNumber>
            <base>DFW</base>
            <division>I</division>
            <seat>CA</seat>
            <flightQualification>
                <hitcities/>
                <monthlyMax>9983</monthlyMax>
                <volMax>0</volMax>
                <restricted75HrCities>
                    <city>
                        <code>GUC</code>
                    </city>
                    <city>
                        <code>MSO</code>
                    </city>
                </restricted75HrCities>
                <equipmentTypes>
                    <equipment>
                        <type>777</type>
                    </equipment>
                </equipmentTypes>
                <green>false</green>
                <isVaccinated>true</isVaccinated>
            </flightQualification>
            <bidQualification>
                <canBid>true</canBid>
                <canBeAwarded>true</canBeAwarded>
            </bidQualification>
        </crewMember>
        <crewMember>
            <id>22222</id>
            <firstName>JANE</firstName>
            <middleName>R</middleName>
            <lastName>DOE</lastName>
            <seniorityNumber>8</seniorityNumber>
            <base>DFW</base>
            <division>I</division>
            <seat>CA</seat>
            <flightQualification>
                <hitcities>
                    <hitcity>
                        <code>OAX</code>
                    </hitcity>
                    <hitcity>
                        <code>MSO</code>
                    </hitcity>
                    <hitcity>
                        <code>US</code>
                    </hitcity>
                </hitcities>
                <monthlyMax>7642</monthlyMax>
                <volMax>0</volMax>
                <restricted75HrCities/>
                <equipmentTypes>
                    <equipment>
                        <type>787</type>
                    </equipment>
                </equipmentTypes>
                <green>false</green>
                <trainerLineCheck>false</trainerLineCheck>
                <trainerLineIndoctrination>false</trainerLineIndoctrination>
                <isVaccinated>true</isVaccinated>
            </flightQualification>
            <bidQualification>
                <canBid>true</canBid>
                <canBeAwarded>true</canBeAwarded>
            </bidQualification>
        </crewMember>
   </crewMembers>
</pbsCrew>
'''

import pandas as pd

stylesheet = '''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <members>
            <xsl:apply-templates select="//crewMember"/>
        </members>
    </xsl:template>
    <xsl:template match="//crewMember">
        <crewMember>
            <ID>
                <xsl:value-of select="./id"/>
            </ID>
            <firstname>
                <xsl:value-of select="./firstName"/>
            </firstname>
            <lastname>
                <xsl:value-of select="./lastName"/>
            </lastname>
            <isVaccinated>
                <xsl:value-of select="./flightQualification/isVaccinated"/>
            </isVaccinated>
        </crewMember>
    </xsl:template>
</xsl:stylesheet>'''

df = pd.read_xml(xml, xpath="//crewMember", stylesheet = stylesheet)
print(df)

这里,样式表将原始XML转换为以下形式:

<?xml version="1.0" encoding="UTF-8"?>
<members>
   <crewMember>
      <ID>12345</ID>
      <firstname>John</firstname>
      <lastname>Doe</lastname>
      <isVaccinated>true</isVaccinated>
   </crewMember>
   <crewMember>
      <ID>22222</ID>
      <firstname>JANE</firstname>
      <lastname>DOE</lastname>
      <isVaccinated>true</isVaccinated>
   </crewMember>
</members>

这允许我们使用xpath<code>//crewMember</code>将<code>Crewmembers</code>元素的子元素作为dataframe行字段。

 类似资料:
  • 在Python3下,我有一个dict,格式如下: 我想使用dict键作为列将其转换为数据帧: 但是,当我尝试以下命令时,我有一个ValueError:

  • 问题内容: 我对熊猫有些陌生。我有一个熊猫数据框,它是1行乘23列。 我想将其转换为系列吗?我想知道最pythonic的方法是什么? 我试过了,但是抱怨。它不够聪明,无法意识到它仍然是数学上的“向量”。 谢谢! 问题答案: 它不够聪明,无法意识到它仍然是数学上的“向量”。 可以说它足够聪明,可以识别尺寸差异。:-) 我认为您可以做的最简单的事情是使用位置选择该行,这将为您提供一个Series,其列

  • 假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是:

  • 问题内容: 我正在使用python 3.6并尝试使用以下代码将json文件(350 MB)下载为pandas数据框。但是,出现以下错误: 我该如何解决错误? 问题答案: 如果以二进制()格式打开文件,则会得到字节。怎么样:

  • 问题内容: 我有以下熊猫数据框: 我想将日期时间索引转换为数据框的列。我尝试过,但结果没有改变。任何想法? 问题答案: 需要分配输出或参数:

  • 我想读取ArcGIS形状文件的文件,并将其转储到数据帧中。我目前正在使用dbf包。 显然,我已经能够将文件作为一个表加载,但还不能理解如何解析它并将其转换为一个数据帧。怎么做? 这就是我所处的困境: Python将此语句作为输出返回,坦率地说,我不知道该如何处理: 编辑 我的原始示例: