XML в Excel в python - PullRequest
       3

XML в Excel в python

0 голосов
/ 27 мая 2020

У меня есть большой XML файл (около 2 МБ), который я хочу преобразовать в Excel. Пока безуспешно, но я просто не понимаю, почему .......

XML формат:

<?xml version="1.0" encoding="utf-8"?>
<XMLData xmlns:xsi="http://www.w3.org">
  <PinList>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName />
      <System>1</System>
      <Type>DataType2</Type>
    </Pin>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName>Data1</PinName>
      <System>2</System>
      <Type>DataType1</Type>
    </Pin>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName>Data2</PinName>
      <System>3</System>
      <Type>DataType3</Type>
    </Pin>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName>Data3</PinName>
      <System>4</System>
      <Type>DataType2</Type>
    </Pin>
  </PinList>
</XMLData>

Это мой код:

def readFile(filename):
    if not os.path.exists(filename): return
    tree = ET.parse(filename)
    root = tree.getroot()

    dict_keys = ["PinName","System","Type" ]
    mdlist = []
    for child in root.findall("PintableData"):
        temp = []
        for key in dict_keys:
            temp.append(child.find(key).text)
        mdlist.append(temp)
    return mdlist

def to_Excel(mdlist):

    wb = Workbook()
    ws = wb.active
    for i,row in enumerate(mdlist):
        for j,value in enumerate(row):
            ws.cell(row=i+1, column=j+1).value = value
    newfilename = os.path.abspath("/xml_to_excel.xlsx")
    wb.save(newfilename)
    print("complete")
    return

result = readFile("//location/of/file/test.xml")
if result:
    to_Excel(result)

Я не получаю никакой ошибки или какого-либо вывода.

Это мой целевой результат

Нет системного PinName Тип Комментарий

1 Ответ

0 голосов
/ 28 мая 2020

Приведенный ниже код анализирует xml и сохраняет атрибуты, которые вы ищете, в файл с именем data.csv. Excel прочитал csv файлы.

import xml.etree.ElementTree as ET


xml = '''<XMLData xmlns:xsi="http://www.w3.org">
  <PinList>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName />
      <System>1</System>
      <Type>DataType2</Type>
    </Pin>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName>Data1</PinName>
      <System>2</System>
      <Type>DataType1</Type>
    </Pin>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName>Data2</PinName>
      <System>3</System>
      <Type>DataType3</Type>
    </Pin>
    <Pin>
      <Comment />
      <LedAdr>-1</LedAdr>
      <PinName>Data3</PinName>
      <System>4</System>
      <Type>DataType2</Type>
    </Pin>
  </PinList>
</XMLData> '''

keys = ["PinName","System","Type" ]
data = []
root = ET.fromstring(xml)
pins = root.findall('.//Pin')
for pin in pins:
  data.append([])
  for key in keys:
    value = pin.find(key)
    if value is not None:
      txt = value.text if value.text is not None else 'not_found'
      data[-1].append(txt)
    else:
      data[-1].append('not_found')
with open('data.csv','w') as f:      
  for entry in data:
   print(','.join(entry))
   f.write(','.join(entry)+'\n')
...