Преобразование XML в CSV с использованием Python - PullRequest
0 голосов
/ 10 октября 2019

У меня есть приведенный ниже XML-файл, который нужно преобразовать в csv только с полями «value». Есть несколько сотен возможностей, которые различны для каждого типа / версии XML.

Я пытался использовать приведенный ниже код в python3 и получал сообщение об ошибке: «AttributeError: объект« NoneType »не имеет атрибута« текст »».

import pandas as pd
import xml.etree.ElementTree as et
xtree = et.parse("data.xml")
xroot = xtree.getroot()
output=[]
for node in xroot:
   v = node.find("value").text
   output.append(v);

out_df = pd.DataFrame(output, columns = ["value"])
out_df.to_csv('output.csv')

Мой ввод data.xml такой, как показано ниже

<?xml version="1.0" encoding="UTF-8"?>
<records>
<record source="AJS/SHD" type="call">
<group name="General">
<field name="RecordType" value="RESGJG"/>
<field name="RecordTypeHEC" value="PY"/>
<field name="NodeID" value="rock.dsjjgds.cm"/>
<field name="SequenceNumber" value="7937973"/>
<field name="StartDate" value="20171049979"/>
<field name="EndDate" value="201704059739793"/>
<field name="CallDuration" value="973979i"/>
<field name="CauseForRecordClosing" value="normal"/>
</group>
<group name="SIP">
<field name="ICID" value="dshhkdhs"/>
<field name="CallID" value="sdidydakyd2133@10.10.10.1"/>
<field name="User-Agent" value="NotPresent"/>
<field name="Request-URI" value="sip:+47668384"/>
<field name="CalledPartyNumber" value="sip:+08779379972"/>
<field name="CallingPartyNumber" value="sip:+07073873772@10.0.0.1"/>
<field name="To" value="sip:+878379739"/>
<field name="From" value="sip:+937973962"/>
</group>
<group name="VPN">
<field name="VPN_NAME_B" value="blshahd"/>
<field name="VPN_Group_B" value="ctr"/>
<field name="B_ExtType" value="part"/>
<field name="B_ISDN" value="7973"/>
<field name="B_SIP" value="67367672"/>
<field name="B_PABXID" value="797397"/>
</group>
</record>
</records>

Ожидаемый вывод - экспортировать все "значения" в CSV-файл ниже.

RESGJG,PY,rock.dsjjgds.cm,7937973,20171049979,201704059739793,973979i,normal,dshhkdhs,sdidydakyd2133@10.10.10.1,NotPresent,sip:+47668384,sip:+08779379972,sip:+07073873772@10.0.0.1,sip:+878379739,sip:+937973962,blshahd,ctr,part,7973,67367672,797397

Пожалуйстапомогите, я пробовал разные ссылки на python, но не повезло.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Ниже

import pprint
import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0" encoding="UTF-8"?>
<records>
<record source="AJS/SHD" type="call">
<group name="General">
<field name="RecordType" value="RESGJG"/>
<field name="RecordTypeHEC" value="PY"/>
<field name="NodeID" value="rock.dsjjgds.cm"/>
<field name="SequenceNumber" value="7937973"/>
<field name="StartDate" value="20171049979"/>
<field name="EndDate" value="201704059739793"/>
<field name="CallDuration" value="973979i"/>
<field name="CauseForRecordClosing" value="normal"/>
</group>
<group name="SIP">
<field name="ICID" value="dshhkdhs"/>
<field name="CallID" value="sdidydakyd2133@10.10.10.1"/>
<field name="User-Agent" value="NotPresent"/>
<field name="Request-URI" value="sip:+47668384"/>
<field name="CalledPartyNumber" value="sip:+08779379972"/>
<field name="CallingPartyNumber" value="sip:+07073873772@10.0.0.1"/>
<field name="To" value="sip:+878379739"/>
<field name="From" value="sip:+937973962"/>
</group>
<group name="VPN">
<field name="VPN_NAME_B" value="blshahd"/>
<field name="VPN_Group_B" value="ctr"/>
<field name="B_ExtType" value="part"/>
<field name="B_ISDN" value="7973"/>
<field name="B_SIP" value="67367672"/>
<field name="B_PABXID" value="797397"/>
</group>
</record>
</records>'''

data = []
root = ET.fromstring(xml)
groups = root.findall('.//group')
for group in groups:
  data.append([f.attrib['value'] for f in group.findall('./field')])
pprint.pprint(data)

выход

[['RESGJG',
  'PY',
  'rock.dsjjgds.cm',
  '7937973',
  '20171049979',
  '201704059739793',
  '973979i',
  'normal'],
 ['dshhkdhs',
  'sdidydakyd2133@10.10.10.1',
  'NotPresent',
  'sip:+47668384',
  'sip:+08779379972',
  'sip:+07073873772@10.0.0.1',
  'sip:+878379739',
  'sip:+937973962'],
 ['blshahd', 'ctr', 'part', '7973', '67367672', '797397']]
0 голосов
/ 10 октября 2019

Попробуйте это. «Значения» - это столбец, который вы хотите отфильтровать из XML и CSV.

import pandas as pd
import xml.etree.ElementTree as et 

xtree = et.parse("data.xml")
xroot = xtree.getroot()
output=[]

for node in xroot:
   values = node.find("values").text
   output.append(values);

out_df = pd.DataFrame(output, columns = ["values"])

out_df.to_csv('output.csv')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...