2016-07-13 2 views
2

У меня есть этот XML и я хочу, чтобы разобрать в кадр данных панды:Синтаксический XML для dataframe в питона с теми же узлами

<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> 
    <CPE>PT0002000022161425NP</CPE> 
    <CPE>PT0002000022161458JH</CPE> 
    <CPE>PT0002000022161471ZP</CPE> 
    <CPE>PT0002000022161505SL</CPE> 
</DISTRITO> 

и это мой код Python:

from lxml import objectify 
from lxml import etree 
import pandas as pd 

path = '/TestFile.xml' 
xml = objectify.parse(open(path)) 
root = xml.getroot() 
data = [] 

for i in root:  
    el_data = {} 
    for child in root.getchildren():   
     el_data[child.tag] = child.pyval 
     # print el_data 
     data.append(el_data) 

df = pd.DataFrame(data) 

Проблема заключается в том что, когда я получаю результат он возвращает только последний узел «» значение:

    CPE NOME_DISTRITO 
0 PT0002000022161505SL  BRAGANCA 
1 PT0002000022161505SL  BRAGANCA 
2 PT0002000022161505SL  BRAGANCA 
3 PT0002000022161505SL  BRAGANCA 
4 PT0002000022161505SL  BRAGANCA 

Я копал немного в мой файл XML и я нашел что это происходит, когда я получаю одинаковые имена для узлов. Например, если бы мой файл был таким:

<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> 
    <CPE1>PT0002000022161425NP</CPE1> 
    <CPE2>PT0002000022161458JH</CPE2> 
    <CPE3>PT0002000022161471ZP</CPE3> 
    <CPE4>PT0002000022161505SL</CPE4> 
</DISTRITO> 

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

Спасибо, ребята!

ответ

1

У вас есть две проблемы, первая вы перезаписать значения, если вы повторили ключи во внутреннем цикле, вы также присоединяя ссылку к тем же Dict/объект в петле таким образом, любые изменения, внесенные отражены везде, поэтому вы видите только последнее значение каждый раз.

Вы должны были бы создать Dict внутри внутреннего цикла, так что вы получаете добавить новый объект каждый раз:

for child in root.getchildren(): 
    data.append({child.tag: child.pyval}) 

выше даст вам все значения, я не уверен, что точный формат, который вы хотите так как я не совсем понимаю, что должны делать ваши петли. Это может быть близко к тому, что вы хотите:

x = """<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> 
    <CPE>PT0002000022161425NP</CPE> 
    <CPE>PT0002000022161458JH</CPE> 
    <CPE>PT0002000022161471ZP</CPE> 
    <CPE>PT0002000022161505SL</CPE> 
</DISTRITO>""" 

root = etree.fromstring(x) 
from lxml import objectify 
import pandas as pd 

root = objectify.fromstring(x) 


df = pd.DataFrame(((child.tag, child.pyval) for child in root.getchildren())) 

print(df) 

Который даст вам:

     0   1 
0   NOME_DISTRITO BRAGANCA 
1 PT0002000022161425NP  CPE 
2 PT0002000022161458JH  CPE 
3 PT0002000022161471ZP  CPE 
4 PT0002000022161505SL  CPE 
+0

Спасибо за ваш ответ. Я просто хочу немного разобраться в etree, объективировать и вообще как разбирать XML в кадре данных с Python. У меня огромный XML-файл, и я хочу преобразовать его в табличный файл для лучшего чтения. Благодаря!! Вы мне очень помогли. :) –

+0

@JulianaRivera, без проблем, пожалуйста. –

 Смежные вопросы

  • Нет связанных вопросов^_^