Извлечение xml в pandas dataframe с неизвестным количеством узлов - PullRequest
0 голосов
/ 17 апреля 2019

Приведенный ниже пример кода работает, если имеется только один узел. Однако в нашем случае использования мы не знаем, сколько узлов мы получим

Преобразование xml в pandas фрейм данных python

Образец, как показано ниже. Как мы можем разобрать это в dataframe В частности, мы не знаем, как мы получим в файле фида

<?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>

1 Ответ

0 голосов
/ 17 апреля 2019

Я подозреваю, что вам нужно проанализировать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...