AttributeError: объект ‘str’ не имеет атрибутов ‘values’ вложенного словаря из XML

#python #json #xml #dataframe #dictionary

#python #json #xml #фрейм данных #словарь

Вопрос:

У меня есть источник из XML-файла, а затем я преобразовал dict его так :

 data= {
  "Head": {
    "@xmlns": "http://www...",
    "@xmlns:xsi": "http://www...",
    "@xsi:schemaLocation": "http://www...",
    "Header": {
      "Num": " ",
      "Type": {
        "source": "user",
        "text": "Training"
      },
      "FNum": "SSSSS",
      "FDate": "2020-10-02T04:30:00Z",
      "From": "ABC",
      "To": "DEF",
      "AC": "AAAA",
      "Reg": "BBBB"
    },
    "AdditionalComment": " ", #Cause of problem!
    "Period": {
      "Duration": " ",
      "LOL": "false"
    }
  }
}
  

Первоначально в xml это выглядит так (я не могу их изменить) :

 .....
  <Header>
             ......
  </Header>
    <AdditionalComment/> # Focus here
    <Period>
        <Duration/>
        <LOL>false</LOL>
    </Period>
</Head>
  

Мой код работает отлично, если я исключаю AdditionalComment , но я не могу исключить их по некоторым причинам. Однако я получу эту ошибку, если я ВКЛЮЧУ AdditionalComment :

 if any([isinstance(x, dict) for x in y.values()] for y in data): AttributeError: 'str' object has no attribute 'values'
  

at pd.json_normalize . Я тестировал путем замены значений, также не работает.

Ниже приведены мои текущие коды:

 # Replacing None to other values
def replaceNone(data_dict,v,rv):
    for key1 in data_dict.keys():
        if data_dict[key1] == v:
            data_dict[key1] = rv
        elif type(data_dict[key1]) is dict:
            replaceNone(data_dict[key1],v,rv)


with open('test_file.xml') as fd:
    doc = xmltodict.parse(fd.read())

    data = json.dumps(doc)
    data = json.loads(data)
    replaceNone(data,None," ")

# Get list of key for next iteration
key_list = []
for l_key, l_value in data.items():
        
    for n_key, n_value in l_value.items():
            
        # Exclude unnecessary key from the list
        if n_key == '@xmlns' or n_key == '@xmlns:xsi' or n_key == '@xsi:schemaLocation' or n_key == 'AdditionalComment':
                continue
        else:
            key_list.append(n_key)
        
    
# Join flatten dictionary to a new dataframe
for key, value in data.items():
    k = 0
    for idx in key_list:
        data_df = pd.json_normalize(data[key][idx]) #HITTING ERROR HERE
        if k==0:
            final_df = data_df
        else:
            final_df = final_df.join(data_df, lsuffix='_left')
        k  = 1