将xml提取到节点数未知的数据帧

2024-10-02 10:25:13 发布

您现在位置:Python中文网/ 问答频道 /正文

如果只有一个节点,下面的代码示例就可以工作。 然而,在我们的用例中,我们不知道将接收多少节点

Convert a xml to pandas data frame python

样品如下。 如何将其解析为数据帧 特别是,我们不知道有多少男人 我们将在feed文件中接收

<?xml version = '1.0' encoding = 'UTF-8'?>
<EVENT spec="IDL:com/RfcCallEvents:1.0#Z_BAPI_UPDT_SERV_NOTIFICATION">
   <eventHeader>
      <objectName/>
      <objectKey/>
      <eventName/>
      <eventId/>
   </eventHeader>
   <TAB_DETAIL_DATA>
      <ZNEWFLAG>X</ZNEWFLAG>
      <FENUM>2</FENUM>
      <BAUTL>661-01727</BAUTL>
      <OTEIL/>
      <FECOD>KBB</FECOD>
      <URCOD>B08</URCOD>
      <ZCOMPMDF>A</ZCOMPMDF>
      <ZOPREPL/>
      <ZWRNCOV>LP</ZWRNCOV>
      <ZWRNREF/>
      <ZNEWPS>C07XMAAEJCLD</ZNEWPS>
      <ZOLDPN/>
      <ZOLDPD/>
      <ZOLDPS>C07XMAACJCLD</ZOLDPS>
      <MAILINFECOD/>
      <ZUNITPR/>
      <ZNEWPD/>
      <ZNEWPN/>
      <ZABUSE/>
      <ZRPS>S</ZRPS>
      <ZEXKGB/>
      <ZKGBMM/>
      <ZINSTS>000</ZINSTS>
      <ZACKBB/>
      <ZCHKOVR/>
      <ZSNDB/>
      <ZNOTAFISCAL/>
      <ZCONSGMT/>
      <ZPRTCONS/>
      <ZZRTNTRNO/>
      <ZZRTNCAR/>
      <ZZINSPECT/>
      <ZZPR_OPT/>
   </TAB_DETAIL_DATA>
   <TAB_DETAIL_DATA>
      <ZNEWFLAG>X</ZNEWFLAG>
      <FENUM>1</FENUM>
      <BAUTL>661-01727</BAUTL>
      <OTEIL/>
      <FECOD>KBB</FECOD>
      <URCOD>B08</URCOD>
      <ZCOMPMDF>A</ZCOMPMDF>
      <ZOPREPL/>
      <ZWRNCOV>LP</ZWRNCOV>
      <ZWRNREF/>
      <ZNEWPS>C07XMAAEJCLD</ZNEWPS>
      <ZOLDPN/>
      <ZOLDPD/>
      <ZOLDPS>C07XMAACJCLD</ZOLDPS>
      <MAILINFECOD/>
      <ZUNITPR/>
      <ZNEWPD/>
      <ZNEWPN/>
      <ZABUSE/>
      <ZRPS>S</ZRPS>
      <ZEXKGB/>
      <ZKGBMM/>
      <ZINSTS>000</ZINSTS>
      <ZACKBB/>
      <ZCHKOVR/>
      <ZSNDB/>
      <ZNOTAFISCAL/>
      <ZCONSGMT/>
      <ZPRTCONS/>
      <ZZRTNTRNO/>
      <ZZRTNCAR/>
      <ZZINSPECT/>
      <ZZPR_OPT/>
   </TAB_DETAIL_DATA>
   <TAB_HEADER_DATA>
      <QMNUM>030334920069</QMNUM>
      <ZGSXREF>CONSUMER</ZGSXREF>
      <ZVANTREF>G338005317</ZVANTREF>
      <ZSHIPER/>
      <ZSHPRNO/>
      <ZRVREF/>
      <ZTECHID>4HQ2OD6C19</ZTECHID>
      <ZADREPAIR/>
      <ZZKATR7/>
   </TAB_HEADER_DATA>
</EVENT>

Tags: data节点tabdetailfenumzcompmdfzinstszrps
1条回答
网友
1楼 · 发布于 2024-10-02 10:25:13

我怀疑您需要将xml数据解析为多个数据帧,例如:

import xmltodict # install this module first
data = """<?xml version = '1.0' encoding = 'UTF-8'?>
<EVENT spec="IDL:com/RfcCallEvents:1.0#Z_BAPI_UPDT_SERV_NOTIFICATION">
   <eventHeader>
      <objectName/>
      <objectKey/>
      <eventName/>
      <eventId/>
   </eventHeader>
   <TAB_DETAIL_DATA>
      <ZNEWFLAG>X</ZNEWFLAG>
      <FENUM>2</FENUM>
      <BAUTL>661-01727</BAUTL>
      <OTEIL/>
      <FECOD>KBB</FECOD>
      <URCOD>B08</URCOD>
      <ZCOMPMDF>A</ZCOMPMDF>
      <ZOPREPL/>
      <ZWRNCOV>LP</ZWRNCOV>
      <ZWRNREF/>
      <ZNEWPS>C07XMAAEJCLD</ZNEWPS>
      <ZOLDPN/>
      <ZOLDPD/>
      <ZOLDPS>C07XMAACJCLD</ZOLDPS>
      <MAILINFECOD/>
      <ZUNITPR/>
      <ZNEWPD/>
      <ZNEWPN/>
      <ZABUSE/>
      <ZRPS>S</ZRPS>
      <ZEXKGB/>
      <ZKGBMM/>
      <ZINSTS>000</ZINSTS>
      <ZACKBB/>
      <ZCHKOVR/>
      <ZSNDB/>
      <ZNOTAFISCAL/>
      <ZCONSGMT/>
      <ZPRTCONS/>
      <ZZRTNTRNO/>
      <ZZRTNCAR/>
      <ZZINSPECT/>
      <ZZPR_OPT/>
   </TAB_DETAIL_DATA>
   <TAB_DETAIL_DATA>
      <ZNEWFLAG>X</ZNEWFLAG>
      <FENUM>1</FENUM>
      <BAUTL>661-01727</BAUTL>
      <OTEIL/>
      <FECOD>KBB</FECOD>
      <URCOD>B08</URCOD>
      <ZCOMPMDF>A</ZCOMPMDF>
      <ZOPREPL/>
      <ZWRNCOV>LP</ZWRNCOV>
      <ZWRNREF/>
      <ZNEWPS>C07XMAAEJCLD</ZNEWPS>
      <ZOLDPN/>
      <ZOLDPD/>
      <ZOLDPS>C07XMAACJCLD</ZOLDPS>
      <MAILINFECOD/>
      <ZUNITPR/>
      <ZNEWPD/>
      <ZNEWPN/>
      <ZABUSE/>
      <ZRPS>S</ZRPS>
      <ZEXKGB/>
      <ZKGBMM/>
      <ZINSTS>000</ZINSTS>
      <ZACKBB/>
      <ZCHKOVR/>
      <ZSNDB/>
      <ZNOTAFISCAL/>
      <ZCONSGMT/>
      <ZPRTCONS/>
      <ZZRTNTRNO/>
      <ZZRTNCAR/>
      <ZZINSPECT/>
      <ZZPR_OPT/>
   </TAB_DETAIL_DATA>
   <TAB_HEADER_DATA>
      <QMNUM>030334920069</QMNUM>
      <ZGSXREF>CONSUMER</ZGSXREF>
      <ZVANTREF>G338005317</ZVANTREF>
      <ZSHIPER/>
      <ZSHPRNO/>
      <ZRVREF/>
      <ZTECHID>4HQ2OD6C19</ZTECHID>
      <ZADREPAIR/>
      <ZZKATR7/>
   </TAB_HEADER_DATA>
</EVENT>"""

dct = xmltodict.parse(data)

def make_df(name="TAB_DETAIL_DATA", dct=dct):
    df = pd.DataFrame()
    if isinstance(dct['EVENT'][name], list):
        for j in dct['EVENT'][name]:
            _ = pd.DataFrame({'value': [y for x, y in j.items()]}, index=j.keys())
            df = pd.concat([df, _])
    else:
        df = pd.DataFrame({'value': [y for x, y in dct['EVENT'][name].items()]}, index=dct['EVENT'][name].keys())
    return df

现在,您可以尝试使用解析器:

make_df(name="TAB_HEADER_DATA") # produces single df

enter image description here

make_df(name="TAB_DETAIL_DATA") # concatenates all content occurred in TAB_DETAIL_DATA sections, returns  single df

相关问题 更多 >

    热门问题